Проблемы, возникшие с Dynami c SQL - PullRequest
0 голосов
/ 08 мая 2020
ALTER PROCEDURE [dbo].[Create_Subjects]
    @Subj_ID nvarchar(9)
AS
    DECLARE @First3Digits nvarchar(3);
    DECLARE @Result int;
    DECLARE @Sql nvarchar(max)

    -- Fetching the fiest 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
        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'@Subj_ID nvarchar(9), @Result bit out', @Subj_ID = @Subj_ID, @Result = @Result out; 
        -- checking if the subject is present in the view    
    END
    ELSE
    BEGIN
        -- Create a view as view doesn't exist
        SET @Sql = 'create view ' + @First3Digits 
                    + ' as 
    (select SubjectName from dbo.Subjects where SubjectName like '+@First3Digits+'%'+');';
        EXECUTE sp_executesql @Sql, N'@First3Digits nvarchar(3)', @First3Digits= @First3Digits;
        SET @Result = 0;
    END

    RETURN @Result
GO

Это код для выполнения хранимой процедуры:

EXEC [dbo].[Create_Subjects] '1234567890'

Обнаружена ошибка:

Сообщение 156, уровень 15, состояние 1, строка 28
Неправильный синтаксис рядом с ключевым словом 'view'

Сообщение 102, уровень 15, состояние 1, строка 29
Неправильный синтаксис рядом с ')'

1 Ответ

1 голос
/ 08 мая 2020

Есть ряд проблем с вашим SQL. Но во-первых, способ их отладки - это напечатать SQL, не выполняя его, затем его нормальный SQL, и вы легко сможете определить, что с ним не так.

  1. SQL, составляющее представление.
  2. Вы должны заключать строки в кавычки как обычно, что означает удвоение кавычек в динамической c строке.
  3. Используйте quotename снова как предложено в комментариях.
  4. Нет необходимости передавать параметр @First3Digits в sp_executesql, потому что к этому моменту вы уже использовали его значение - что вам необходимо сделать, если вы создаете представление.
    set @Sql = 'create view dbo.' + quotename(@First3Digits)
        + ' as'
        + ' select SubjectName'
        + ' from dbo.Subjects'
        + ' where SubjectName like ''' + @First3Digits + ''' + ''%'';';

    -- This is how you debug dynamic SQL
    print(@Sql);

    execute sp_executesql @Sql;

Примечание: как я уже упоминал в вашем предыдущем вопросе, с предоставленной информацией это кажется действительно плохим дизайном. Почти наверняка есть лучший способ решить вашу большую проблему с изображением. Как прокомментировал Мартин Смит, стоит изучить встроенную табличную функцию .

...