动态更新sql

时间:2011-12-09 09:43:16

标签: sql sql-server sql-server-2008 tsql

我正在构建一个动态的sql update语句。此语句将更新未知数量的列。我正在寻找一种聪明的方法来在update-statement中的列之间设置逗号。

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

4 个答案:

答案 0 :(得分:0)

循环后,删除最后一个字符?

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


将','的位置更改为附加代码的FRONT,但不要将其设置为第一个...

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

答案 1 :(得分: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) 

答案 2 :(得分:0)

由于字符串可能以逗号结尾,请尝试:

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

答案 3 :(得分:0)

除了动态SQL之外,总是有更好的方法做事情......表格的列数有限,即使更新是动态的。在这种情况下,使用条件SET子句写一个完整的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语句,以便于管理。

这意味着查询将被缓存,执行速度会更快(虽然这是可以忽略不计的),但最重要的是,代码将更容易阅读和调试。