SQL передает строку в хранимую процедуру, которая не является именем столбца - PullRequest
0 голосов
/ 05 июня 2019

Можно ли передать строку в хранимую процедуру, которая не является именем столбца?

Мне нужно вызвать StoredProcedure из C #.

Следующее не работает, так как параметр не может быть определен без его Типа, но показывает, что я пытаюсь сделать.Проблема в том, что Sql смотрит на @stringToIdentifyDataTable как ColumnName, что кажется справедливым, но не то, что я пытаюсь сделать.

Alter PROCEDURE [dbo].[PutNewTypeSource] @stringToIdentifyDataTable, 
@ID int, @Description varchar(50), @Active bit
AS
DECLARE 
@Query AS VARCHAR(MAX), 
@Field_Out AS VARCHAR(MAX)

SELECT @Field_Out = CASE @stringToIdentifyDataTable
                        WHEN 'ReferralSource' THEN '[Adm].[JobReferralSource]'
                        WHEN 'ReferralSource2' THEN '[Adm].[JobReferralSource2]'
                    END 

SET @Query = concat('
IF EXISTS (SELECT ID FROM ',@Field_Out,' WHERE Description= ',@Description,')
    BEGIN
        UPDATE ',@Field_Out,
        'SET Active = ',@Active,
        'WHERE Description= ',@Description,';
    END')

EXEC (@Query)


exec [PutNewTypeSource] 'ReferralSource', 1, 'Description1', 0

1 Ответ

0 голосов
/ 05 июня 2019

Если Я правильно понимаю, что вы могли бы сделать, это. обратите внимание, что я правильно цитирую ваш объект, и , что важно , настраивает ваши параметры. То, что у вас было раньше, было широко открыто для инъекций:

ALTER PROCEDURE [dbo].[PutNewTypeSource] @Referral varchar(50), @Description varchar(50), @Active bit --I remvoed @ID as it was never used
AS BEGIN

    DECLARE @Schema sysname,
            @Table sysname;
    SET @Schema = CASE WHEN @Referral IN ('ReferralSource','ReferralSource2') THEN N'adm' END;
    SET @Table = CASE @Referral WHEN 'ReferralSource' THEN N'JobReferralSource'
                                WHEN 'ReferralSource2' THEN N'JobReferralSource2' END;

    DECLARE @SQL nvarchar(MAX);

    SET @SQL = N'UPDATE ' + QUOTENAME(@Schema) + N'.' + QUOTENAME(@Table) + NCHAR(13) + NCHAR(10) +
               N'SET Active = @Active' + NCHAR(13) + NCHAR(10) +
               N'WHERE Description= @Description;';

    EXEC sp_executesql @SQL, N'@Description varchar(50), @Active bit', @Description = @Description, @Active = @Active;
END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...