【问题标题】:execute result of select statementselect语句的执行结果
【发布时间】:2011-05-17 18:17:25
【问题描述】:

如何执行我的选择查询的结果。下面的查询给了我一些 SQL 语句作为结果。我想执行does语句,怎么做?所有这些都在 SQL Sever Management Studio 中执行。

查询:

SELECT 'UPDATE Rolecopy SET PartofFT = ''' + R2.PlayedbyOT + ''', OriginalOT = ''' + R.PlayedbyOT + ''' WHERE RoleNo = ' + CAST(R.RoleNo AS VARCHAR) + CHAR(13)
FROM Role R INNER JOIN Role R2
ON R.PartofFT = R2.PartofFT AND R.RoleNo <> R2.RoleNo
WHERE EXISTS (
    SELECT PG.RoleNo
    FROM V_PurposeGrouping PG
    WHERE R.PartofFT = PG.PartofFT
    AND R.RoleNo <> PG.RoleNo
)

结果:

UPDATE Rolecopy SET PartofFT = 'Student', OriginalOT = 'Teacher' WHERE RoleNo = 5.00
UPDATE Rolecopy SET PartofFT = 'Project', OriginalOT = 'Teacher' WHERE RoleNo = 8.00
UPDATE Rolecopy SET PartofFT = 'Project', OriginalOT = 'description' WHERE RoleNo = 10.00
UPDATE Rolecopy SET PartofFT = 'Student', OriginalOT = 'Project' WHERE RoleNo = 15.0

0

【问题讨论】:

  • 可以使用exec语句:EXEC(@mySql)
  • 我会研究动态 sql。确定你可以使用 exec(@sql),但这对任何 sql 注入都是开放的。
  • 不起作用,因为引用了我认为 Msg 203, Level 16, State 2, Procedure SP_Grouping, Line 28 The name '' is not a valid identifier.

标签: sql-server executequery


【解决方案1】:

尝试使用您的第一个查询打开游标,然后在循环中将结果字符串作为动态 SQL 执行。

declare commands cursor for
SELECT 'UPDATE Rolecopy SET PartofFT = ''' + R2.PlayedbyOT + ''', OriginalOT = ''' + R.PlayedbyOT + ''' WHERE RoleNo = ' + CAST(R.RoleNo AS VARCHAR) + CHAR(13)
FROM Role R INNER JOIN Role R2
ON R.PartofFT = R2.PartofFT AND R.RoleNo <> R2.RoleNo
WHERE EXISTS (
    SELECT PG.RoleNo
    FROM V_PurposeGrouping PG
    WHERE R.PartofFT = PG.PartofFT
    AND R.RoleNo <> PG.RoleNo
)

declare @cmd varchar(max)

open commands
fetch next from commands into @cmd
while @@FETCH_STATUS=0
begin
  exec(@cmd)
  fetch next from commands into @cmd
end

close commands
deallocate commands

【讨论】:

  • 我想知道是否有人可以提出一个很好的递归 cte 语句来结合动态 sql 语句来使其工作。如果我有时间我会试试的。
  • 我的意思是您使用 cte 生成初始选择语句,然后使用递归 cte 将其全部附加到字符串中,然后执行该语句。如果你做得对,你还可以在不同的字符串中设置参数并将其发送到 sp_executesql 语句。至少理论上它可以工作,我必须尝试一下
  • @DForck42,我想我明白你在说什么,它应该是可行的。我很想知道它是否有什么好处......除了维护头痛......
  • 当然,但是如果做得对,那么您就没有机会像使用 exec(@sql) 那样将一串 sql 代码放入数据并执行它
【解决方案2】:

试试这个:

SELECT 'UPDATE Rolecopy SET PartofFT = ''' + R2.PlayedbyOT + ''', OriginalOT = ''' + R.PlayedbyOT + ''' WHERE RoleNo = ' + CAST(R.RoleNo AS VARCHAR) + CHAR(13)
FROM Role R INNER JOIN Role R2
ON R.PartofFT = R2.PartofFT AND R.RoleNo <> R2.RoleNo
WHERE EXISTS (
    SELECT PG.RoleNo
    FROM V_PurposeGrouping PG
    WHERE R.PartofFT = PG.PartofFT
    AND R.RoleNo <> PG.RoleNo
)
FOR XML PATH ('')

结果进入一个字符串列:

UPDATE Rolecopy SET PartofFT = 'Student', OriginalOT = 'Teacher' WHERE RoleNo = 5.00
UPDATE Rolecopy SET PartofFT = 'Project', OriginalOT = 'Teacher' WHERE RoleNo = 8.00
UPDATE Rolecopy SET PartofFT = 'Project', OriginalOT = 'description' WHERE RoleNo = 10.00
UPDATE Rolecopy SET PartofFT = 'Student', OriginalOT = 'Project' WHERE RoleNo = 15.0

全部在同一列中。

【讨论】: