【问题标题】:using Dynamic SQL - Custom Universal Multi-Action Stored Procedure (with TVPar)使用动态 SQL - 自定义通用多动作存储过程(使用 TVPar)
【发布时间】:2016-04-07 13:36:23
【问题描述】:

这是我开始写的存储过程 问题是我不知道如何处理从 TV par 读取值的部分:

必须声明表变量“@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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 相当复杂的表达式,我可以从逻辑上理解中间线的存在,但最后一个-@par=@par?哦..它不接近c /c++ / c#编程成语
    猜你喜欢
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    相关资源
    最近更新 更多