2009-05-06 37 views
1

我需要編寫一個存儲過程來更新一組相似列中的一個。這些列被命名爲「UserField1」,「UserField2」等。我希望將參數傳遞給SPROC,它將設置要更新的列。但是,我似乎無法得到正確的代碼。下面是我的嘗試(這讓我的「語法錯誤」消息)一個簡單的例子:TSQL參數化SPROC問題

create procedure UpdateUserField 
    (@UserFieldNumber int, @UserFieldNewValue int) 
as 
    update MyTable set 
     case @UserFieldNumber 
     when 1 then UserField1 
     when 2 then UserField2 
     end 
    = @UserFieldNewValue 
+0

地方它說了「不正確的語法」在發生腳本? '關鍵字'CASE'附近的' – 2009-05-06 15:18:48

+0

'。 – dsteele 2009-05-06 15:25:14

回答

2

如何使用多個IF?

CREATE PROCEDURE UpdateUserField 
(
    @UserFieldNumber int, 
    @UserFieldNewValue int 
) AS 

IF @UserFieldNumber=1 
BEGIN 
    UPDATE MyTable SET UserField1 = @UserFieldNewValue 
END 

IF @UserFieldNumber=2 
BEGIN 
    UPDATE MyTable SET UserField2 = @UserFieldNewValue 
END 

或者你可以建立動態SQL在EXEC

CREATE PROCEDURE UpdateUserField 
(
    @UserFieldNumber int, 
    @UserFieldNewValue int 
) AS 

EXEC('UPDATE MyTable SET UserField' + CONVERT(varchar(10), @UserFieldNumber) + ' = ' + CONVERT(varchar(10), @UserFieldNewValue)) 

當心SQL注入,如果你做到這一點雖然與整數你會不會有問題,其他任何你可能需要考慮風險。

-1

我不認爲你可以在語句中使用CASE語句中字段列出。我幾乎肯定你只能將CASE陳述應用於你正在設置,返回或測試的值。

在你的例子中,你試圖用case語句來修改字段列表,並且我假設SQL有問題,因爲直到語句被編譯並運行之後,字段列表纔會被確定,這是一種雞和雞蛋的情況。

0
if @UserFieldNumber=1 
BEGIN 
    update MyTable set [email protected] where... 
END 
ELSE if @UserFieldNumber=2 
BEGIN 
    update MyTable set [email protected] where... 
END 
ELSE if @UserFieldNumber=3 
BEGIN 
    update MyTable set [email protected] where... 
END 
+0

這是一個可怕的可怕的解決方案:( 如果他有50個可能的領域... 該sproc將是巨大的 – 2009-05-06 15:25:11

+0

@Eoin坎貝爾,他已經有一個可怕的設計,但不能超過語法錯誤,他有很多問題,最少的是這個解決方案! – 2009-05-06 15:30:07

+0

Gee,謝謝:)這裏的背景是我必須從內部程序更新MS Outlook的Microsoft Business Contact Manager插件中的表格。 – dsteele 2009-05-06 15:32:30

0

update命令不接受動態字段名稱。

相反,你可以做的是建立與您要執行更新語句的字符串,然後執行它,就像這樣:

DECLARE @strToExecute VARCHAR(1000) 
SET @strToExecute = 'UPDATE MyTable ' 
IF @UserFieldNumber = 1 
    SET @strToExecute = @strToExecute + ' SET UserField1 = ' 
IF @UserFieldNumber = 2 
    SET @strToExecute = @strToExecute + ' SET UserField2 = ' 

等,以建立您的字符串,然後執行它。

+0

第4行和第6行的第二個'='應該是'+' – 2009-05-06 15:49:26

+0

哈!你是對的。修正了 - 很好的結果。當我在那裏的時候,把它變成一個社區維基,以便其他人可以修復更多的錯別字,哈哈哈。 – 2009-05-06 15:57:18

-1

AFAIK您不能使用CASE WHEN來指定列。

雖然你可以將它包含在某些動態SQL中。

CREATE PROCEDURE UpdateUserField 
( 
    @UserFieldNumber int, 
    @UserFieldNewValue int 
) 
AS 

DECLARE @sql nvarchar(max) 
SET @sql = 'UPDATE MyTable SET UserField' + @UserFieldNumber + ' = ' + @UserFieldNewValue 
EXEC (@sql) 
+0

您的代碼將導致錯誤,您不能將int連接到一個字符串上,並且空值將會填充整個字符串 – 2009-05-06 15:32:12

2

如果你不想使用動態SQL或多個IFUPDATE語句的話,你可以嘗試這樣的東西,而不是:

UPDATE MyTable 
SET UserField1 = CASE WHEN @UserFieldNumber = 1 
     THEN @UserFieldNewValue ELSE UserField1 END, 
    UserField2 = CASE WHEN @UserFieldNumber = 2 
     THEN @UserFieldNewValue ELSE UserField2 END