2010-10-04 114 views
6

Primero trato de explicar las circunstancias. Guardo la expresión del filtro en una columna separada por saltos de línea. La idea de base era la siguiente:¿Por qué no se puede usar la instrucción INSERT EXEC dentro de un procedimiento almacenado llamado por otro procedimiento almacenado?

SELECT 
'SELECT ''' + REPLACE(topic_filter,CHAR(10),''' UNION ALL SELECT ''') + '''' 
FROM dbo.topic_filter T 
WHERE 
    T.id = @id 
FOR XML PATH('') 

Después de esto, simplemente ejecutar esta secuencia de poner los datos básicos en una tabla temporal. Mi problema comienza aquí. El fragmento está en un procedimiento almacenado y es utilizado por múltiples procedimientos almacenados para generar la fuente base que se debe llenar.
Método 1:
Llama a este SP desde otro SP para completar una tabla temporal.
Resultado 1:
No se puede anidar una instrucción INSERT EXEC. (. Si llamo simplemente con DBO ejecutivo ... estilo del código está trabajando solo me dan el error si trato de llamar dentro de un procedimiento almacenado)

Enfoque 2:
pongo el código anterior en una mesa función de valores.
Resultado 2:
Uso no válido de un operador de efectos secundarios 'INSERT EXEC' dentro de una función. (La función en sí no compilado)

Gracias,
Péter

Respuesta

4

Mientras tanto logré resolver el problema (con ayuda :)). La solución es simple:

exec('insert into t2 ' + @str) 

Donde @str contiene una instrucción de selección.
No sé por qué, pero de esta manera no hay ningún error. El método que llamo el procedimiento almacenado:

SET @exec = 'exec dbo.trFilterTopic ''' + @id+ ''',null,null,1' 
INSERT INTO #filtered 
exec (@exec) 

Espero que dedique algo de tiempo a otras personas con esta solución.
adiós,
Péter

+2

Esto no funciona.Al menos en MS Transact SQL 2008. – Jackson

2

Es una restricción de SQL Server. No puede tener un insert exec anidado (no estoy seguro de por qué).

Si ir:

insert into t(value) 
exec dbo.proc 

, y en el interior dbo.proc tiene

insert into t2(value2) 
exec(@str) 

, entonces no va a funcionar.

Considere diferentes formas de pasar tablas, como temporary tables o table-valued parameters.

+0

Hola GSerg, me no entiendo cómo esto afecta el problema central. La parte donde la cadena convertida a una tabla todavía tiene que estar en la parte inferior de la pila de llamadas. Así que simplifique mi pregunta, ¿cómo poner esa cadena en una tabla y usar los resultados en procedimientos almacenados sobre ella? Gracias, Péter –

+0

Solo una conjetura, pero para evitar un ciclo infinito. –

-1

funciones en SQL Server tiene limitaciones, que arenot procedimientos, no se puede utilizar SQL dinámico como 'ejecutar la cadena', 'INSERT EXEC' ...

Cuestiones relacionadas