Tengo un procedimiento almacenado que devuelve filas:
CREATE PROCEDURE MyProc
AS
BEGIN
SELECT * FROM MyTable
END
Mi procedimiento real es un poco más complicado, por eso es necesario un sproc.
¿Es posible seleccionar la salida llamando a este procedimiento?
Algo como:
SELECT * FROM (EXEC MyProc) AS TEMP
Necesito usar SELECT TOP X
, ROW_NUMBER
y una WHERE
cláusula adicional para localizar mis datos, y realmente no quiero pasar estos valores como parámetros.
sql
sql-server
sql-server-2005
stored-procedures
jonathanpeppers
fuente
fuente
Respuestas:
Puede usar una función definida por el usuario o una vista en lugar de un procedimiento.
Un procedimiento puede devolver múltiples conjuntos de resultados, cada uno con su propio esquema. No es adecuado para usar en una
SELECT
declaración.fuente
Usted puede
... sql ....
fuente
INSERT #T
oINSERT @T
es que unaINSERT EXEC
declaración no se puede anidar. Si el procedimiento almacenado ya tiene unINSERT EXEC
, no funcionará.Desea una función con valores de tabla o inserte su EXEC en una tabla temporal:
fuente
INSERT #T
oINSERT @T
es que unaINSERT EXEC
declaración no se puede anidar. Si el procedimiento almacenado ya tiene unINSERT EXEC
, no funcionará.Debe leer sobre OPENROWSET y OPENQUERY
fuente
Debe declarar un tipo de tabla que contenga el mismo número de columnas que devuelve su procedimiento de almacenamiento. Los tipos de datos de las columnas en el tipo de tabla y las columnas devueltas por los procedimientos deben ser iguales
Luego debe insertar el resultado de su procedimiento almacenado en el tipo de tabla que acaba de definir
Al final solo seleccione de su tipo de tabla
fuente
No es necesario utilizar una tabla temporal.
Esta es mi solucion
fuente
sp_serveroption 'MYSERVER', 'DATA ACCESS', TRUE;
Puede copiar la salida de sp a la tabla temporal.
fuente
use OPENQUERY y antes de Ejecutar set 'SET FMTONLY OFF; SET NOCOUNT ON; '
Pruebe este código de muestra:
fuente
Intente convertir su procedimiento en una función en línea que devuelva una tabla de la siguiente manera:
Y luego puedes llamarlo como
También tiene la opción de pasar parámetros a la función de la siguiente manera:
Y llámalo
fuente
Si 'ACCESO A DATOS' es falso,
después,
funciona.
fuente
Puedes engañar un poco con OPENROWSET:
Esto todavía correría todo el SP cada vez, por supuesto.
fuente
En aras de la simplicidad y para que sea ejecutable de nuevo, he utilizado un sistema StoredProcedure "sp_readerrorlog" para obtener datos:
fuente
Parece que solo necesitas usar una vista . Una vista permite que una consulta se represente como una tabla para que se pueda consultar la vista.
fuente
Si su servidor se llama SERVERX, por ejemplo, así es como lo hice ...
Para comprobar que esto funcionó, comenté la
EXEC()
línea de comando y la reemplacé porSELECT @CMD
para revisar el comando antes de intentar ejecutarlo. Eso fue para asegurarse de que todo el número correcto de comillas simples estuviera en el lugar correcto. :-)Espero que ayude a alguien.
fuente