生成多个UPDATE语句并执行它们

时间:2017-12-19 14:56:12

标签: sql sql-server tsql

我需要生成多重更新语句。

此代码:

DECLARE @query as varchar(max);
SET @query =

'declare @data_dzis as nvarchar(10)
declare @data_wczoraj as nvarchar(10)
SELECT @data_dzis=convert(varchar,convert(int,convert(datetime,convert(date,GETDATE()))))
SELECT @data_wczoraj=convert(varchar,convert(int,convert(datetime,convert(date,GETDATE()-1))))

    Select
        ''update V_''+IdStr + '' set start='' + @data_wczoraj + '' where DataVersionId=0 and start='' + @data_dzis +'';''
    FROM [KW_GRECOS].[dbo].[Variable]
    where Granularity=0 and IdStr<>''_ROOT_FOLDER_'''

exec(@query);

...生成更新列表作为记录集:

update V_G012 set start=43085 where DataVersionId=0 and start=43086;
update V_G059 set start=43085 where DataVersionId=0 and start=43086;
update V_G002a set start=43085 where DataVersionId=0 and start=43086;
update V_G0122 set start=43085 where DataVersionId=0 and start=43086;
update V_103D set start=43085 where DataVersionId=0 and start=43086;
update V_G072 set start=43085 where DataVersionId=0 and start=43086;
update V_G201 set start=43085 where DataVersionId=0 and start=43086;
update V_G001a set start=43085 where DataVersionId=0 and start=43086;
update V_G067a set start=43085 where DataVersionId=0 and start=43086;

我不知道如何自动执行它们。 我不得不复制它们并手动执行,但这不是我的观点。

2 个答案:

答案 0 :(得分:2)

首先,您的更新语句使您看起来有不同的表描述相同的数据实体。这是一个糟糕的数据库设计,如果可能的话应该重构 所有这些V_ + IdStr表应该是一个表,其中IdStr只是另一列。

假设无法做到这一点,我相信其余的答案就是你要找的:

@query变量改为nvarchar(max)而不是varchar(max),并使用sp_executeSql将更新语句作为输出变量。
添加一个变量以将查询结果连接到(我在我的示例中称之为@statements,注意带有Added this!注释的行:

DECLARE @query as nvarchar(max),
        @Update nvarchar(max);

SET @query =

'declare @data_dzis as nvarchar(10)
declare @data_wczoraj as nvarchar(10)
SELECT @data_dzis=convert(varchar,convert(int,convert(datetime,convert(date,GETDATE()))))
SELECT @data_wczoraj=convert(varchar,convert(int,convert(datetime,convert(date,GETDATE()-1))))
Set @statemets = '''';  -- Added this!
Select @statemets += -- Added this!
        ''update V_''+IdStr + '' set start='' + @data_wczoraj + '' where DataVersionId=0 and start='' + @data_dzis +'';''
    FROM [KW_GRECOS].[dbo].[Variable]
    where Granularity=0 and IdStr<>''_ROOT_FOLDER_'''

EXECUTE sp_executesql @query, N'@statemets nvarchar(max) OUTPUT', @statemets=@Update OUTPUT

PRINT @Update
--EXECUTE sp_executesql  @Update

一旦您看到@Update变量包含正确的更新语句,请删除Print行并取消注释Execute行。

See a simplified live demo on rextester.

答案 1 :(得分:1)

你不需要在@query中做所有这些 未经测试

declare @data_dzis    as nvarchar(10)
declare @data_wczoraj as nvarchar(10)
SELECT @data_dzis    = convert(varchar,convert(int,convert(datetime,convert(date,GETDATE()))))
SELECT @data_wczoraj = convert(varchar,convert(int,convert(datetime,convert(date,GETDATE()-1))))

DECLARE @query as nvarchar(max);
SET @query = 'Select ''update V_''+ IdStr + '' set start='' + @data_wczoraj + 
             '' where DataVersionId=0 and start='' + @data_dzis +'';''
             FROM [KW_GRECOS].[dbo].[Variable]
             where Granularity=0 and IdStr<>''_ROOT_FOLDER_'''

exec(@query);