2

это хранимая процедура, с которой я начал писать проблема заключается в том, что я не мог понять, как обрабатывать часть значений чтения из TV par :с использованием динамического SQL - пользовательская универсальная многопользовательская хранимая процедура (с TVPar)

Должен объявить переменную таблицы "@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 

ответ

2

Используйте 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 
+0

довольно сложное выражение, я мог бы понять существование средней линии логически, но последний - '@ par = @ par'? ох .. это не близко к идиоме программирования c/C++/C# –

 Смежные вопросы

  • Нет связанных вопросов^_^