2011-05-17 114 views
10

如何执行我的选择查询的结果。下面的查询为我提供了一些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

我想看看动态SQL。确定你可以使用exec(@sql),但是这对任何sql注入都是开放的。 – DForck42 2011-05-17 18:27:51

+0

您可以使用'exec'语句:EXEC(@mySql) – Tejs 2011-05-17 18:22:18

+0

不起作用,因为我认为引号是 消息203,级别16,状态2,过程SP_Grouping,行28 名称''不是一个有效的标识。 – Bas 2011-05-17 19:25:17

回答

15

尝试使用第一个查询打开游标,然后在循环中执行结果字符串作为动态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 
+0

我想知道是否有人可以拿出一个很好的递归cte语句与动态sql语句结合起来,让这个工作。如果我有时间,我会尝试。 – DForck42 2011-05-17 18:40:31

+0

@ DForck42,我不认为递归cte就是这样的。 – chezy525 2011-05-17 19:03:27

+0

我的意思是你使用cte来生成初始选择语句,然后使用递归cte将它全部附加到一个字符串中,然后执行该语句。如果你做得对,你也可以用不同的字符串设置参数并将其发送到sp_executesql语句。至少在理论上它可以工作,我必须尝试 – DForck42 2011-05-17 20:08:49

3

尝试使用这样的:

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 

所有在同一列。