【问题标题】:How to use table type in T-SQL dynamically如何在 T-SQL 中动态使用表类型
【发布时间】:2017-09-16 01:32:06
【问题描述】:

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

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”

【问题讨论】:

标签: sql-server stored-procedures dynamic exec


【解决方案1】:

使用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 */

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2010-11-05
      • 2011-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-24
      • 1970-01-01
      相关资源
      最近更新 更多