web-dev-qa-db-fra.com

Utilisation de EXEC dans une instruction SELECT dans SQL Server

Je dois utiliser exec à l'intérieur de la clause select. La requête pour l'exec est créée en fonction des colonnes de la table sur laquelle la clause select est utilisée. Ce que je veux faire est quelque chose comme suit:

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

Ici, GetStringForIsActive est la procédure stockée que je veux exécuter pour chaque ligne sélectionnée dans MasterTableForLanguage
Le stored procedure utilisera EXEC pour exécuter la chaîne suivante

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

TableName et TableFKey seront des entrées de la procédure stockée.

11
Ruchit Rami

utilisez des fonctions au lieu de procédures stockées dans la clause SELECT.

Édité:

créer cette fonction

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

puis 

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

Est-ce que ça a du sens?

3
Boomer

Si vous pouvez modifier votre procédure stockée GetStringForIsActive pour renvoyer TableName, TableFKey et IsActive, vous pouvez utiliser un curseur pour l'exécuter pour chaque ligne et ajouter les résultats à une table temporaire.

c'est à dire:

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

Le code serait comme ça:

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
1
Lex

Eh bien, je pense que pour répondre à la question complète, je ne crois pas qu'une procédure stockée exécuterait une instruction SELECT, elle effectuerait simplement la commande SELECT.

Vous exécutez votre proc actuel et transmettez-le vars, et il renvoie une valeur BASÉE sur l'instruction select qu'il exécute. Il ne s'agit pas d'exécuter cette déclaration, mais simplement d'effectuer une sélection. J'ai plusieurs procs stockés que j'utilise quotidiennement dans certains processus d'agent SQL, ils effectuent tous des sélections pour interroger différentes tables et aucun d'eux n'appelle un EXEC pour effectuer ces actions. Ceci est mon propre exemple:

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

Comme mentionné précédemment, le moyen le plus efficace d'exécuter votre requête serait d'effectuer cette sélection dans une fonction. Un résultat similaire à celui-ci suffira:

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

Vous pouvez alors faire exactement ce que vous voulez ...

SELECT distinct 
     MTMain.[TableName],
     MTMain.[TableFKey], 
     ThisFunction(MTMain.[TableName],MTMain.[TableFKey])
 FROM
     [MasterTableForLanguage] MTMain
0
user2746894