2011-05-17 12 views
10

¿Cómo puedo ejecutar los resultados de mi consulta de selección? La consulta a continuación me da algunas declaraciones SQL como resultado. Quiero ejecutar declaraciones de hace, ¿cómo hacer esto? Todo esto se ejecuta en SQL Sever Management Studio.ejecutar el resultado de la instrucción de selección

Consulta:

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 
) 

Resultado:

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

me gustaría ver en sql dinámico. Seguro que puedes usar exec (@sql), pero está abierto a cualquier inyección sql. – DForck42

+0

Puede usar la instrucción 'exec': EXEC (@mySql) – Tejs

+0

no funciona, debido a las comillas creo Msg 203, nivel 16, estado 2, procedimiento SP_Grouping, línea 28 El nombre '' no es un identificador válido – Bas

Respuesta

15

Trate de usar su primera consulta para abrir un cursor, a continuación, dentro del bucle ejecutar la cadena de resultado de SQL dinámico.

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

me pregunto si alguien podría venir con una buena declaración de cte recursiva para combinar con una declaración dinámica de sql para hacer que esto funcione. si tuviera tiempo, lo probaría. – DForck42

+0

@ DForck42, no creo que un cte recursivo funcione así. – chezy525

+0

lo que quiero decir es que usa una cte para generar la instrucción de selección inicial, luego utiliza una cte recursiva para agregarla a una cadena y luego ejecutarla. si lo hizo bien, también podría configurar los parámetros en una cadena diferente y enviarlos a la instrucción sp_executesql. al menos en teoría podría funcionar, tendría que intentarlo – DForck42

3

Trate de usar esto:

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 ('') 

Por lo que el resultado va a la columna de una cadena:

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 

Todo en la misma columna.

Cuestiones relacionadas