执行select语句的结果

14

如何执行我所选查询的结果。下面的查询语句将一些SQL语句作为结果返回给我。我想执行这些语句,该怎么做?所有这些都在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)。 - Tejs
我会研究一下动态SQL。当然,你可以使用exec(@sql),但这会导致SQL注入的风险。 - DForck42
由于引号的原因,无法正常工作。Msg 203,级别16,状态2,过程SP_Grouping,第28行 名称“”不是有效标识符。 - Bas
2个回答

27
尝试使用第一个查询打开游标,然后在循环内作为动态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语句来使其工作。如果我有时间,我会尝试一下。 - DForck42
我的意思是使用CTE生成初始的SELECT语句,然后使用递归CTE将其全部附加到一个字符串中,最后执行该字符串。如果你做得对,还可以在另一个字符串中设置参数并将其发送到sp_executesql语句中。至少从理论上讲,它可以工作,我得尝试一下。 - DForck42
@DForck42,我认为我明白了你在说什么,应该是可行的。除了维护方面会有一些麻烦之外,我很好奇是否会有任何收获。 - chezy525
当然,但如果做得正确,那么您就不会有机会让某人将一串SQL代码放入数据中并执行它,就像使用exec(@sql)一样。 - DForck42

4
尝试使用以下内容:

试用此代码:

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

在同一列中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接