2012-06-27 3 views
9

Ich brauche exec innerhalb von select Klausel. Die Abfrage für die Exec wird gemäß den Spalten der Tabelle erstellt, für die eine Select-Klausel verwendet wird. Was ich möchte, ist so etwas wie folgt vor:Verwenden EXEC innerhalb SELECT-Anweisung in SQL Server

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

Hier GetStringForIsActive ist die gespeicherte Prozedur, die ich für jede Zeile von MasterTableForLanguage ausgewählt ausgeführt werden soll.
Die stored procedure wird EXEC verwenden die folgende Zeichenfolge

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

Tablename auszuführen und TableFKey wird Eingänge des gespeicherten Prozedur sein.

+4

Sie Funktionen anstelle von gespeicherten Prozedur verwenden sollten, wenn Sie sie innerhalb select-Klausel – Boomer

+0

Post proc verwenden möchten. Ich weiß nicht, was Sie innerhalb des Procs tun, vielleicht können Sie es zu einer Funktion ändern oder es sogar besser als Subselects lösen. – YvesR

+0

Ich verwende die gespeicherte Prozedur für die Ausführung einer Zeichenfolge. Ich muss es auf diese Weise tun, weil ich die Spalte [TableName] als Tabelle verwenden und prüfen muss, ob der Wert [TableFKey] in einer bestimmten Spalte dieser Tabelle endet. –

Antwort

3

Verwenden Sie Funktionen anstelle von gespeicherten Prozeduren in SELECT-Klausel.

Editiert:

erstellen, die Funktion

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

dann

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

Does this Sinn?

+1

Es gibt viele Dinge, die nicht in einer Funktion getan werden können, die in einem proc getan werden kann. –

+1

Sie können gespeicherte Prozedur immer noch nicht von der Funktion aufrufen. versuchen Sie, Ihre gespeicherte Prozedur in eine Funktion zu konvertieren – Boomer

+1

Ich muss EXEC innerhalb der Funktion verwenden. überprüfe meinen Kommentar zu der Frage. –

1

Wenn Sie Ihre gespeicherte Prozedur GetStringForIsActive ändern können, um TableName, TableFKey und IsActive zurückzugeben, können Sie einen Cursor verwenden, um es für jede Zeile auszuführen und die Ergebnisse zu einer temporären Tabelle hinzuzufügen.

dh:

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

Der Code würde wie folgt sein:

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

Nun, ich denke, die vollständige Frage zu beantworten, ich habe nicht eine gespeicherte Prozedur glauben, eine SELECT-Anweisung würde EXEC , würde es einfach die SELECT durchführen.

Sie EXEC Ihre aktuelle Proc und übergeben Sie es Vars, und es gibt einen Wert basierend auf der Select-Anweisung, die es ausgeführt wird. Es gibt diese Anweisung nicht aus, sondern führt nur eine Auswahl aus. Ich habe mehrere gespeicherte Procs, die ich täglich in einigen SQL-Agentenprozessen verwende. Sie führen alle Selects durch, um verschiedene Tabellen abzufragen, und keiner von ihnen ruft einen EXEC auf, um diese Aktionen auszuführen. Das ist mein eigenes Beispiel:

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 

Wie bereits erwähnt, der effektivste Weg, um Ihre Abfrage durchzuführen wäre, dass wählen, um diese in einer Funktion, etwas auszuführen ähnlich Ich werde tun, denke:

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 

Sie könnten dann genau das tun, wie Sie wollen ...

SELECT distinct 
    MTMain.[TableName], 
    MTMain.[TableFKey], 
    ThisFunction(MTMain.[TableName],MTMain.[TableFKey]) 
FROM 
    [MasterTableForLanguage] MTMain 
Verwandte Themen