我需要在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将是存储过程的输入。
答案 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