【问题标题】:Generate multiple UPDATE statements and execute them生成多个 UPDATE 语句并执行它们
【发布时间】:2017-12-20 05:23:48
【问题描述】:

我需要生成多更新语句。

这段代码:

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;

我不知道如何自动执行它们。 我必须复制它们并手动执行,但这不是我的意思。

【问题讨论】:

标签: sql sql-server tsql


【解决方案1】:

首先,您的更新语句使您看起来好像有不同的表来描述相同的数据实体。这是一个糟糕的数据库设计,应该尽可能重构。
所有这些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.

【讨论】:

    【解决方案2】:

    您无需在 @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);
    

    【讨论】:

    • 虽然您的观察是正确的,但它并不能回答问题。另外,您在Select 之前忘记了'
    猜你喜欢
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 2015-05-10
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 2020-02-09
    相关资源
    最近更新 更多