如何在T-SQL中动态使用表类型

时间:2017-04-19 17:18:09

标签: sql-server stored-procedures dynamic exec

我想用动态参数创建存储过程。其中一个参数是表类型

CREATE TYPE [dbo].[IdTable] AS TABLE ([Id] [int] NULL)
GO

CREATE PROCEDURE [dbo].[SP_deleteCells]
    @table IdTable READONLY,
    @tableName NVARCHAR(50),
    @fieldName NVARCHAR(50),
    @result BIT OUTPUT
AS
    DECLARE @SQL NVARCHAR(500);

    SET @SQL='delete from TBL_CustomerTerminal where ID in (select ID from @table)'
    EXEC (@SQL);

    SET @result = @@ROWCOUNT;

如何在没有错误的情况下执行此代码?现在,我得到:

  

必须声明表变量" @ table"

2 个答案:

答案 0 :(得分:4)

使用sp_executesql

exec sp_executesql N'delete from TBL_CustomerTerminal where ID in (select ID from @table)'
  , N'@table dbo.IdTable readonly'  /* parameter declaration for sp_executesql */
  , @table /* pass the parameters */

答案 1 :(得分:1)

对于上面的查询,您似乎不需要动态SQL。但我认为这只是一个样本。

动态SQL查询具有自己的代码可见性。它无法在局部定义的变量之外看到任何变量。如果要将参数传递给查询,则需要使用sp_executesql而不是EXEC。

https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-executesql-transact-sql