在SQL Server中的SELECT语句中使用EXEC

时间:2012-06-27 09:19:54

标签: sql sql-server

我需要在exec子句中使用select。 exec的查询是根据表的列创建的,如果使用select子句的话。我想做的是如下:

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

这里,GetStringForIsActive是我想为从MasterTableForLanguage中选择的每一行执行的存储过程。
stored procedure将使用EXEC执行以下字符串

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

TableName和TableFKey将是存储过程的输入。

3 个答案:

答案 0 :(得分:2)

在SELECT子句中使用函数而不是存储过程。

编辑:

创建该功能

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

然后

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

这有意义吗?

答案 1 :(得分:1)

如果您可以修改存储过程GetStringForIsActive以返回TableName,TableFKey和IsActive,则可以使用游标为每一行执行它并将结果添加到临时表。

即:

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

代码如下:

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

答案 2 :(得分:0)

好吧,我想回答完整的问题,我不相信存储过程会执行SELECT语句,它只会执行SELECT。

您执行当前的proc并将其传递给vars,并根据它运行的select语句返回一个值。它不是执行该声明,只是执行选择。我在一些SQL代理进程中每天使用几个存储过程,它们都执行选择以查询各种表,并且它们都没有调用EXEC来执行这些操作。这是我自己的例子:

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

如前所述,执行查询的最有效方法是在函数内执行选择,类似于我认为会这样做:

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

然后你可以按照你想要的那样做......

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