14

我需要使用execinside ofselect子句。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 将是存储过程的输入。

4

3 回答 3

2

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

IE:

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
于 2012-06-27T10:12:04.000 回答
0

在 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

这有意义吗?

于 2012-06-27T09:24:46.843 回答
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
于 2017-05-05T17:13:39.730 回答