2011-12-09 85 views
1

我構建了一個動態的sql更新語句。此聲明將更新未知數量的列。我正在尋找一種聰明的方法來設置update-statement中的列之間的逗號是正確的。動態更新sql

DECLARE @UpdateSQL nvarchar(max) = 'UPDATE MYTABLE SET ' 
WHILE (somecondition) 
BEGIN 
    IF (someothercondition) 
     SET @UpdateSQL = @UpdateSQL + @ColNameVar + ' = ' @ColNameVar + ',' --How to set this comma only on columns that are not the last?? 
END 

有更多的建築與這個updateSQL有關,但這是我的問題的唯一相關部分。

一個重要的注意事項是while循環的最後一次運行並不是必須在更新中添加一個新列,所以我不能用它作爲檢查。

任何想法?

使用SQL Server 2008

回答

0

你的循環後,剝去最後一個字符?

SET @UpdateSQL = LEFT(@UpdateSQL, LEN(@UpdateSQL) - 1) 


變化的所附代碼前面的位置「」,但不要將其設置爲第一個...

DECLARE @UpdateSQL nvarchar(max) = 'UPDATE MYTABLE SET ', @comma NVARCHAR(2) = ' ' 
WHILE (somecondition) 
BEGIN 
    IF (someothercondition) 
    BEGIN 
     SET @UpdateSQL = @UpdateSQL + @comma + @ColNameVar + ' = ' @ColNameVar 
     SET @comma  = ', ' 
    END 
END 
+0

謝謝!你們都是對的。所以很難選擇誰來標記正確的......:S – user829237

0

你可以除去最後一個字符,如下while循環之後:

DECLARE @UpdateSQL nvarchar(max) = 'UPDATE MYTABLE SET ' 
WHILE (somecondition) 
BEGIN 
    IF (someothercondition) 
     SET @UpdateSQL = @UpdateSQL + @ColNameVar + ' = ' @ColNameVar + ',' 
       --How to set this comma only on columns that are not the last?? 
END 
SET @UpdateSQL = LEFT(@UpdateSQL , LEN(@UpdateSQL)-1) 
+0

謝謝!你們都是對的。所以很難選擇誰標記爲正確的:S – user829237

0

由於串MIG HT 末用逗號,試試這個:

if right(@UpdateSQL, 1) = ',' 
begin 
    set @UpdateSQL = left(@UpdateSQL, len(@UpdateSQL) - 1) 
end 
+0

我相信OP已經測試過,以免自己執行'UPDATE MYTABLE SET' – MatBailie

+0

謝謝!你們都是對的。所以很難選擇誰標記爲正確的......:S – user829237

0

There'a幾乎總是一個更好的方式來做事比動態SQL ...即使更新是動態表有列的數量有限, 。在這種情況下,寫一個完整的UPDATE語句,帶有條件子句集:

UPDATE MYTABLE 
SET Col1 = CASE WHEN ISNULL(@Col1, '') = '' THEN Col1 ELSE @Col1 END, 
Col2 = CASE WHEN ISNULL(@Col2, '') = '' THEN Col1 ELSE @Col2 END, 
Col3 = CASE WHEN ISNULL(@Col3, '') = '' THEN Col1 ELSE @Col3 END, 
Col4 = CASE WHEN ISNULL(@Col4, '') = '' THEN Col1 ELSE @Col4 END 
WHERE Blah = 'blah' 

您報表的確切條款可能會有所不同 - 你可以用ISNULL()或COALESCE來代替CASE語句()使其更容易管理。

這意味着查詢將被緩存,執行會更快(儘管這可以忽略不計),但最重要的是,代碼將更容易閱讀和調試。

+0

這種方法優於您沒有提到的動態sql的優點是動態sql更容易出現sql注入 – BornToCode