ver salida procedimientos procedimiento parametros hacer guardar ejemplo ejecutar como codigo almacenados almacenado sql sql-server sql-server-2005 stored-procedures

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

  1. crear una variable de tabla para mantener el conjunto de resultados del proceso almacenado y luego
  2. inserte la salida del proc almacenado en la variable de tabla, y luego
  3. 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 '')