我正在构建一个动态的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
答案 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语句,以便于管理。
这意味着查询将被缓存,执行速度会更快(虽然这是可以忽略不计的),但最重要的是,代码将更容易阅读和调试。