Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从存储过程执行T-SQL_Sql_Sql Server_Tsql - Fatal编程技术网

从存储过程执行T-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

我试图在存储过程中构建SQL,并使用

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返回清空更新的答案,并提供完整的工作示例。