从存储过程执行T-SQL
我试图在存储过程中构建SQL,并使用从存储过程执行T-SQL,sql,sql-server,tsql,Sql,Sql Server,Tsql,我试图在存储过程中构建SQL,并使用 EXEC sp_executesql 现在我定义了一个本地表,并尝试在需要时传递它 CREATE TYPE mytabletypeAS TABLE ( StartDate DATETIME, EndDate DATETIME, Amount MONEY, AccountId INT ); 在我的存储过程中发生了以下情况,我试图返回由EXEC sp_executesql生成的输出: CREATE PROCEDURE att
EXEC sp_executesql
现在我定义了一个本地表,并尝试在需要时传递它
CREATE TYPE mytabletypeAS TABLE (
StartDate DATETIME,
EndDate DATETIME,
Amount MONEY,
AccountId INT
);
在我的存储过程中发生了以下情况,我试图返回由EXEC sp_executesql
生成的输出:
CREATE PROCEDURE attributevalues.sp_EvalClearingNetSpend
AS
BEGIN
DECLARE @OutPutTable AS mytabletype;
DECLARE @Sql AS NVARCHAR(MAX);
SET @Sql = 'INSERT INTO @OutPutTable SELECT StartDate,EndDate,Amount, AccountId FROM table1';
EXEC sp_executesql @Sql, N'@OutPutTable mytabletype OUTPUT', @OutPutTable OUTPUT;
SELECT * FROM @OutPutTable
END
上面是说我不能用@OutPutTable
传入OUTPUT
救命啊 这是一个问题。不需要您在过程中设置的复杂程度。表类型
,调用sys.sp_executesql
,这些都不需要。只需将“动态”查询的SELECT
语句(它不是动态的,因为没有对象注入)放入您的过程中:
创建过程attributevalues.EvalClearingNetPend AS--已删除sp_uux前缀
开始
从表1中选择StartDate、EndDate、Amount、AccountId;
终止
去
这完全避免了错误,即您正试图使用表
类型
作为输出
参数,因为您不能,但这里不需要。不确定您为什么要麻烦地创建表类型参数并将其填充到from中,然后从中选择。但我们可以说,出于某种原因,你必须这样做
您可以通过这样做来实现这一点,根本不需要使用输出参数,输出参数用于返回标量值,这里您将返回一个表,然后从中进行选择:
CREATE PROCEDURE usp_EvalClearingNetSpend
AS
BEGIN
Declare @Sql as NVARCHAR(MAX);
SET @Sql = N' DECLARE @OutPutTable AS mytabletype;
INSERT INTO @OutPutTable
SELECT StartDate,EndDate,Amount, AccountId
FROM table1;
SELECT * FROM @OutPutTable
';
EXEC sp_executesql @Sql
END
我需要知道的是,是否有一种方法可以从通过EXEC执行的语句中获取值,并从SP返回
对。但是你不能用一个表变量。可以使用sp_executesql将表变量传递到嵌套批处理中,就像传递给存储过程一样,但必须将其标记为只读,因此不能修改它
您可以查看和修改嵌套批次中的现有临时表,例如
drop table if exists table1
go
create table table1
(
StartDate DATETIME,
EndDate DATETIME,
Amount MONEY,
AccountId INT
)
insert into table1 values (getdate(),getdate(),1,1)
go
CREATE OR ALTER PROCEDURE EvalClearingNetSpend
AS
BEGIN
create table #t(
StartDate DATETIME,
EndDate DATETIME,
Amount MONEY,
AccountId INT)
Declare @Sql as NVARCHAR(MAX);
SET @Sql = 'INSERT INTO #T SELECT StartDate,EndDate,Amount, AccountId FROM table1';
EXEC sp_executesql @Sql
SELECT * FROM #T
END
go
exec EvalClearingNetSpend
输出
StartDate EndDate Amount AccountId
----------------------- ----------------------- --------------------- -----------
2021-03-30 08:48:32.350 2021-03-30 08:48:32.350 1.00 1
表类型参数只能是
READONLY
。分配它输出
意味着您想写入它;这是你做不到的。如果不引用表类型参数,为什么还要在此处将其传递给sys.sp_executesql
?另外,前缀sp_
是Microsoft保留的,不应用于用户对象。这样做会降低性能,并可能导致您的过程在将来不再工作。为什么不在过程中使用select
?抱歉,意外删除了一些代码,然后向我们展示一些相关的内容。上述不需要是“动态的”;它没有什么动态性。整个过程可以简化为从表1中选择StartDate、EndDate、Amount、AccountId代码>。我想你没有读过这个问题,我想我读过,@Emil。请注意,在对上述问题的评论中,您得到了我的订婚。。。正如我所提到的,问题是您试图将表类型
用作输出
,这是不允许的,但您根本不需要它。移除所有这些,问题解决了。不,这不会产生output@Emil答案中的代码肯定会产生输出,您能分享您所做的更改吗?这些更改中有某种东西阻止了它返回数据。EXEC sp_executesql@Sql不会传递值。。。然后选择*FROM#T返回清空更新的答案,并提供完整的工作示例。