2012-06-27 126 views
9

Necesito usar exec dentro de la cláusula select. La consulta para el ejecutivo se crea de acuerdo con las columnas de la tabla en la que se selecciona la cláusula si se utiliza. Lo que quiero hacer es algo así como lo siguiente:Uso de EXEC dentro de la instrucción SELECT en SQL Server

SELECT distinct 
    MTMain.[TableName], 
    MTMain.[TableFKey], 
    (select IsActive (exec GetStringForIsActive MTMain.[TableName],MTMain.[TableFKey])) 
FROM 
    [MasterTableForLanguage] MTMain 

Aquí, GetStringForIsActive es el procedimiento almacenado Quiero ejecutar para cada fila seleccionada de MasterTableForLanguage.
El stored procedure utilizará EXEC para ejecutar la siguiente cadena

select IsActive from [TableName] where PKID= cast([TableFKey] as int) 

NombreTabla y TableFKey habrá entradas del procedimiento almacenado.

+4

se debe utilizar en lugar de las funciones de procedimiento almacenado si desea utilizarlos dentro cláusula select – Boomer

+0

Publica tu proc. No sé lo que haces dentro del proceso, quizás puedas cambiarlo a una función o incluso mejor resolverlo como subselecciones. – YvesR

+0

Estoy usando el procedimiento almacenado para la ejecución de una cadena. Necesito hacerlo de esta manera porque necesito usar la columna [TableName] como tabla y verificar si el valor [TableFKey] sale en una columna particular de esa tabla. –

Respuesta

3

use Funciones en lugar de procedimientos almacenados en la cláusula SELECT.

Editado:

cree que la función

CREATE FUNCTION function1 (@TableName nvarchar(10),@TableFKey nvarchar(10)) 
RETURNS nvarchar(100) AS 
BEGIN 
    -- do whatever here 
END 

continuación

SELECT distinct 
    MTMain.[TableName], 
    MTMain.[TableFKey], 
    function1(MTMain.[TableName],MTMain.[TableFKey]) 
FROM 
    [MasterTableForLanguage] MTMain 

¿Tiene esto sentido?

+1

Hay muchas cosas que no se pueden hacer en una función que se puede hacer en un proceso. –

+1

aún no puede llamar al procedimiento almacenado desde la función. intente convertir su procedimiento almacenado a una función – Boomer

+1

Necesito usar EXEC dentro de la función. revisa mi comentario sobre la pregunta. –

1

Si puede modificar su Procedimiento almacenado GetStringForIsActive para devolver TableName, TableFKey e IsActive, puede usar un cursor para ejecutarlo para cada fila y agregar los resultados a una tabla temporal.

es decir:

exec GetStringForIsActive 'TableName', 'TableFKey' 
returns 
select [TableName], [TableFKey], IsActive from [TableName] where PKID= cast([TableFKey] as int) 

El código sería así:

declare @TableName nvarchar(50) 
declare @TableFKey nvarchar(50) 
declare @Results table (TableName nvarchar(50), TableFKey nvarchar(50), IsActive bit) 

declare TableCursor cursor fast_forward for 
    select TableName, TableFKey from MasterTableForLanguage 

open TableCursor 

fetch next from TableCursor into @TableName, @TableFKey 

if @@FETCH_STATUS <> -1 
    print 'MasterTableForLanguage check' 

while (@@FETCH_STATUS <> -1) 
begin 


    insert into @Results 
    exec GetStringForIsActive @TableName, @TableFKey 

    fetch next from TableCursor into @TableName, @TableFKey 

end 
close TaleCursor 
deallocate TableCursor 

select * from @Results 
0

Bueno, creo que para responder a la pregunta completa, no creo que un procedimiento almacenado que EXEC una instrucción SELECT , simplemente realizaría el SELECCIONAR.

Ejecuta su proc actual y lo pasa, y devuelve un valor BASADO EN la instrucción de selección que ejecuta. No está EXECANDO esa afirmación, simplemente realizando una selección. Tengo varios procs almacenados que uso a diario en algunos procesos de agente SQL, todos ellos realizan selecciones para consultar varias tablas, y ninguno de ellos llama un EXEC para realizar esas acciones. Este es mi propio ejemplo:

CREATE PROCEDURE [myproc] 
    @job_ident  INT 
AS 
BEGIN 
    SET NOCOUNT ON; 

    ... 

    SELECT TOP(1) @filter_type = filter_type FROM [place] WHERE [ident] = @job_ident 

    ... 
END 

Como se mencionó anteriormente, la forma más efectiva para llevar a cabo la consulta sería realizar ese selecto dentro de una función, algo similar a esto creo que va a hacer:

CREATE FUNCTION ThisFunction (
    @TableName nvarchar(10), 
    @TableFKey nvarchar(10) 
    ) 
    RETURNS nvarchar(100) 
    AS 
     BEGIN 
      RETURN 
      (
       select IsActive from [TableName] where PKID= cast([TableFKey] as int) 
      ) 
     END 

a continuación, puede hacer exactamente lo que usted quiere ...

SELECT distinct 
    MTMain.[TableName], 
    MTMain.[TableFKey], 
    ThisFunction(MTMain.[TableName],MTMain.[TableFKey]) 
FROM 
    [MasterTableForLanguage] MTMain 
Cuestiones relacionadas