2009-04-08 4 views

Respuesta

9

No puede hacer esto, sin embargo, puede hacerlo como una inserción. p.ej.

insert mytable 
exec myStoredProcedure 

Además, nunca nombre sus procedimientos almacenados sp_xxxx. Esto se debe a que SQL siempre buscará en el área del procedimiento almacenado del sistema debido a sp_ antes de buscar en los procedimientos almacenados del usuario, lo que ocasionará una pequeña pérdida en el rendimiento que podría agregar que es bastante significativa en un proceso que se ejecuta con frecuencia.

+0

Woah, ¿esto funciona? ¡Puede haber cambiado mi vida de SQL! – Dana

+0

¿Puedes hacer esto con "seleccionar en" y luego soltar la tabla después? –

+0

No recuerdo si puede hacer esto con seleccionar, pero no lo creo. Tendrá que crear la estructura de la tabla completa de antemano – cjk

1

¿Qué sucede si el proceso almacenado no devuelve filas? ¿Múltiples conjuntos de resultados? Cambios? Los posibles usos de un proceso almacenado son muchos y variados.

Cuando tiene SELECT * FROM TableOrView, existe una estructura y sintaxis de enlace directo y fácil de verificar.

Más correctamente, en el sentido relacional, un proceso almacenado no es una relación/tabla, por lo que no puede seleccionarlo.

Las funciones definidas por el usuario consiguen lo que desean pero permiten que el código se ajuste a algún concepto de relación/tabla.

1

No puede hacerlo, pero podría considerar una función en sqlserver2005. He aquí un ejemplo de función que crea una tabla de una lista separada por comas

Create Function [dbo].[CsvToInt] (@Array varchar(1000)) 
returns @IntTable table 
    (IntValue int) 
AS 
begin 

    declare @separator char(1) 
    set @separator = ',' 

    declare @separator_position int 
    declare @array_value varchar(1000) 

    set @array = @array + ',' 

    while patindex('%,%' , @array) <> 0 
    begin 

     select @separator_position = patindex('%,%' , @array) 
     select @array_value = left(@array, @separator_position - 1) 

     Insert @IntTable 
     Values (Cast(@array_value as int)) 

     select @array = stuff(@array, 1, @separator_position, '') 
    end 

    return 
end 

Y luego sencilla de selección de la función de separar ...

Select * FROM dbo.CsvToInt('1,2,3,5') 

y obtendrá un valor de la tabla.

2

Es posible, pero ciertamente no es el camino correcto a seguir:

USE test 
GO 
CREATE procedure dbo.select1 AS 
SELECT 1 
GO 
EXEC sp_addlinkedserver @server='OQtest', @datasrc='localhost', @provider='SQLNCLI', @srvproduct='' 
GO 
SELECT * FROM OPENQUERY(OQtest, 'test.dbo.select1') 

También es posible que necesite ajustar la configuración de seguridad en el servidor para que esto funcione.

Cuestiones relacionadas