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

问题描述 投票:1回答:2

我需要生成多更新语句。

这段代码:

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
2个回答
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
投票

你不需要在@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);
© www.soinside.com 2019 - 2024. All rights reserved.