salida - SQL Server-SELECCIONAR DE procedimiento almacenado
procedimiento almacenado sql server select (15)
Debe declarar un tipo de tabla que contenga el mismo número de columnas que devuelve el 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
declare @MyTableType as table
(
FIRSTCOLUMN int
,.....
)
Luego debe insertar el resultado de su procedimiento almacenado en el tipo de tabla que acaba de definir.
Insert into @MyTableType
EXEC [dbo].[MyStoredProcedure]
Al final solo tienes que seleccionar de tu tipo de tabla
Select * from @MyTableType
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 lo que 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 cláusula WHERE
adicional para ROW_NUMBER
mis datos, y realmente no quiero pasar estos valores como parámetros.
Debes leer sobre OPENROWSET y OPENQUERY
SELECT *
INTO #tmp FROM
OPENQUERY(YOURSERVERNAME, ''EXEC MyProc @parameters'')
Debes ver este excelente artículo de Erland Sommarskog:
Básicamente, enumera todas las opciones disponibles para su escenario.
Desea una función de valor de tabla o inserta su EXEC en una tabla temporal:
INSERT INTO #tab EXEC MyProc
En aras de la simplicidad y para que pueda volver a ejecutarse, he utilizado un sistema StoredProcedure "sp_readerrorlog" para obtener datos:
-----USING Table Variable
DECLARE @tblVar TABLE (
LogDate DATETIME,
ProcessInfo NVARCHAR(MAX),
[Text] NVARCHAR(MAX)
)
INSERT INTO @tblVar Exec sp_readerrorlog
SELECT LogDate as DateOccured, ProcessInfo as pInfo, [Text] as Message FROM @tblVar
-----(OR): Using Temp Table
IF OBJECT_ID(''tempdb..#temp'') IS NOT NULL DROP TABLE #temp;
CREATE TABLE #temp (
LogDate DATETIME,
ProcessInfo NVARCHAR(55),
Text NVARCHAR(MAX)
)
INSERT INTO #temp EXEC sp_readerrorlog
SELECT * FROM #temp
Intente convertir su procedimiento en una función en línea que devuelva una tabla de la siguiente manera:
CREATE FUNCTION MyProc()
RETURNS TABLE AS
RETURN (SELECT * FROM MyTable)
Y luego puedes llamarlo como
SELECT * FROM MyProc()
También tiene la opción de pasar parámetros a la función de la siguiente manera:
CREATE FUNCTION FuncName (@para1 para1_type, @para2 para2_type , ... )
Y llamalo
SELECT * FROM FuncName ( @para1 , @para2 )
No es necesario utilizar una tabla temporal.
Esta es mi solucion
SELECT * FROM
OPENQUERY(YOURSERVERNAME, ''EXEC MyProc @parameters'')
WHERE somefield = anyvalue
Puede copiar la salida de sp a la tabla temporaty.
CREATE TABLE #GetVersionValues
(
[Index] int,
[Name] sysname,
Internal_value int,
Character_Value sysname
)
INSERT #GetVersionValues EXEC master.dbo.xp_msver ''WindowsVersion''
SELECT * FROM #GetVersionValues
drop TABLE #GetVersionValues
Puede utilizar una función definida por el usuario o una view lugar de un procedimiento.
Un procedimiento puede devolver varios conjuntos de resultados, cada uno con su propio esquema. No es adecuado para usar en una SELECT
.
Puedes hacer un poco de trampa con OPENROWSET:
SELECT ...fieldlist...
FROM OPENROWSET(''SQLNCLI'', ''connection string'', ''name of sp'')
WHERE ...
Esto todavía ejecutaría todo el SP cada vez, por supuesto.
Si ''DATA ACCESS'' es falso,
EXEC sp_serveroption ''SQLSERVERNAME'', ''DATA ACCESS'', TRUE
después,
SELECT * FROM OPENQUERY(SQLSERVERNAME, ''EXEC DBNAME..MyProc @parameters'')
funciona.
Si su servidor se llama SERVERX por ejemplo, así es como lo hice ...
EXEC sp_serveroption ''SERVERX'', ''DATA ACCESS'', TRUE;
DECLARE @CMD VARCHAR(1000);
DECLARE @StudentID CHAR(10);
SET @StudentID = ''STUDENT01'';
SET @CMD = ''SELECT * FROM OPENQUERY([SERVERX], ''''SET FMTONLY OFF; SET NOCOUNT ON; EXECUTE MYDATABASE.dbo.MYSTOREDPROC '' + @StudentID + '''''') WHERE SOMEFIELD = SOMEVALUE'';
EXEC (@CMD);
Para comprobar que esto funcionó, comenté la línea de comandos EXEC()
y la reemplacé con SELECT @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.
Suena como si solo necesitaras usar una view . Una vista permite que una consulta se represente como una tabla para que, la vista, se pueda consultar.
Usted puede
- crear una variable de tabla para mantener el conjunto de resultados del proceso almacenado y luego
- inserte la salida del proc almacenado en la variable de tabla, y luego
- usa la variable de tabla exactamente como lo harías con cualquier otra tabla ...
... sql ....
Declare @T Table ([column definitions here])
Insert @T Exec storedProcname params
Select * from @T Where ...
use OPENQUERY y antes de ejecutar el conjunto ''SET FMTONLY OFF; CONFIGURAR NOCOUNT ON; ''
Prueba este código de ejemplo:
SELECT top(1)*
FROM
OPENQUERY( [Server], ''SET FMTONLY OFF; SET NOCOUNT ON; EXECUTE [database].[dbo].[storedprocedure] value,value '')