sql-server - 使用动态 SQL - 自定义通用多操作存储过程(使用 TVPar)

标签 sql-server stored-procedures sql-server-2012 dynamic-sql table-valued-parameters

这是我开始编写的存储过程 问题是我不知道如何处理从电视标准读取值的部分:

Must declare the table variable "@TestMultiActionViaRowIndexTVPar".

    ALTER Proc [dbo].[MultiActionViaRowIndexSpTVP] 
    @SelectedSDTOName varchar (50), @SelectedAction varchar(10), @TestMultiActionViaRowIndexTVPar dbo.TestMultiActionViaRowIndexTVType READONLY
    as BEGIN

    declare @CmdStr varchar(500) = '';
        if(@SelectedAction = 'SELECT') Begin --test for one of the "Action" types
            SET @CmdStr = 'SELECT * FROM ' + @SelectedSDTOName + 
            ' WHERE RowIndex in (SELECT RowIndex FROM @TestMultiActionViaRowIndexTVPar)'
        End

       --else - other Action - @CmdStr will be according to action...

    --finally execute constructed Cmdstr
    Exec(@CmdStr);
    END

最佳答案

使用 sp_executesql 将 TVP 或任何其他参数传递给参数化动态 SQL:

ALTER PROC [dbo].[MultiActionViaRowIndexSpTVP] 
      @SelectedSDTOName varchar (50)
    , @SelectedAction varchar(10)
    , @TestMultiActionViaRowIndexTVPar dbo.TestMultiActionViaRowIndexTVType READONLY
AS
DECLARE @CmdStr nvarchar(MAX);

IF @SelectedAction = 'SELECT'
BEGIN
    SET @CmdStr = 'SELECT * FROM ' + @SelectedSDTOName + 
            ' WHERE RowIndex in (SELECT RowIndex FROM @TestMultiActionViaRowIndexTVPar);'
END;

EXEC sp_executesql
     @CmdStr
    ,N'@TestMultiActionViaRowIndexTVPar dbo.TestMultiActionViaRowIndexTVType READONLY'
    ,@TestMultiActionViaRowIndexTVPar = @TestMultiActionViaRowIndexTVPar;
GO

关于sql-server - 使用动态 SQL - 自定义通用多操作存储过程(使用 TVPar),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34582701/

相关文章:

c# - 异常无法将 nvarchar 转换为 int

混合类型的mysql存储过程动态排序

SQL 尝试在存储过程中使用 DATEADD

Oracle PL/SQL 存储过程编译器与 PostgreSQL PGSQL 存储过程编译器

xml - 将 xml 转换为键值对 SQL Server

html - 在sql server客户端报告(rdlc)中渲染html代码

sql-server - 如何在不丢失任何数据的情况下更改 SQL Server 2005 数据库中的主键?

tsql - 我想得到一个二进制值的十六进制值,从中删除 0x

C# 使用脚本创建数据库

vb.net - 使用 VB.NET 备份 SQL Server 数据库