Использовать переменную в динамике c SQL - PullRequest
1 голос
/ 07 мая 2020
ALTER PROCEDURE [dbo].[Create_Subjects]
    @Subj_ID nvarchar(9)
AS
    DECLARE @First3Digits nvarchar(3);
    DECLARE @Result int;

    -- Fetching the first 3 digits of the subject
    SET @First3Digits = SUBSTRING(@Subj_ID,1,3);

    -- Check if view is present or not
    IF EXISTS (SELECT 1 FROM sys.views WHERE Name = @First3Digits)
    BEGIN
        PRINT 'View exists'
        -- checking if the subject is present in the view
        IF EXISTS (SELECT 1 FROM @First3Digits WHERE SubjectName = @Subj_ID)
        BEGIN
            SET @Result = 1;
        END
        ELSE
        BEGIN
            SET @Result = 0;
        END
    END
    ELSE
    BEGIN
        -- Create a view as view doesn't exist
        EXEC('create view' + @First3Digits 
            + 'as 
                    (select SubjectName from dbo.Subjects where SubjectName like '+@First3Digits+'%'+');')

        SET @Result = 0;
        PRINT 'view does not exist'
    END

    PRINT @First3Digits
GO;

В приведенном выше коде возникают проблемы в строке

IF EXISTS (SELECT 1 FROM @First3Digits WHERE SubjectName = @Subj_ID) 

Пожалуйста, помогите мне решить эту проблему.

1 Ответ

2 голосов
/ 07 мая 2020

Строка:

IF EXISTS (SELECT 1 FROM @First3Digits WHERE SubjectName = @Subj_ID)

не работает, потому что @First3Digits - это имя таблицы (я предполагаю, хотя это всего лишь nvarchar(3)!) И не может использоваться напрямую в таком запросе , вместо этого вам нужно использовать динамический c SQL, в частности sp_executesql следующим образом:

PRINT 'View exists'

declare @Sql nvarchar(max);

set @Sql = 'select @Result = case when exists (select 1 from dbo.' + quotename(@First3Digits) + ' where SubjectName = ''' + @Subj_ID + ''') then 1 else 0 end';

execute sp_executesql @Sql, N'@Result bit out', @Result = @Result out; 

-- @Result is now set as required

Обратите внимание на использование quotename для защита от SQL инъекции.

Кроме того, на первый взгляд, ваш дизайн выглядит очень нуждающимся в улучшении. Создание представления для Subject (что бы это ни было на самом деле) кажется некорректным, подверженным проблемам обслуживания и проблемам масштабируемости. Наверное, есть способ получше.

...