Переменная не работает в запросе IF NOT EXISTS .. CREATE TABLE, и я понятия не имею, почему - PullRequest
0 голосов
/ 23 октября 2019

Я использую базу данных SQL Azure (T-SQL) и у меня возникают проблемы с запросом «СОЗДАТЬ ТАБЛИЦУ ЕСЛИ НЕ СУЩЕСТВУЕТ». Я уже прочитал ссылки здесь и, возможно, несколько других:

Мой код:

declare @tableName nvarchar(max);
declare @sqlquery nvarchar(max);
SET @tableName = 'Russ';
SET @sqlquery = 'if not exists (select * from sysobjects where name=' + @tableName + 'and xtype=''U'') create table ' + @tableName + '([ID] [bigint] PRIMARY KEY NOT NULL DEFAULT (NEXT VALUE FOR dbo.standardsequence), [Name One] [nvarchar](64) NOT NULL, [Name Two] [nvarchar](64) NOT NULL)';
exec sp_executesql @sqlquery;
  • Ошибка, которую я получаю: «Синтаксическая ошибка рядом с xtype = 'U'», но я избежал этой части такЯ не понимаю проблему там.
  • В каждом месте говорят, что использовать sp_executesql, что я и делаю. Я также попытался установить переменную в операторе sp_executesql (например, EXECUTE sp_executesql @SQL, N '@ tableName VARCHAR (10)', 'Russ'), но она также не работает таким образом.
  • Запроспрекрасно работает без переменных, поэтому я уверен, что проблема в этом, но просто не знаю почему.

Что я делаю не так? Я в тупике. Если бы было тупое бюро, они бы объявили меня официально тупым.

1 Ответ

2 голосов
/ 23 октября 2019

table name неправильно завершен, дополнительные кавычки исправят его.

, но рекомендуется добавлять begin и end при использовании условных операторов в sql

declare @tableName nvarchar(max);
declare @sqlquery nvarchar(max);
SET @tableName = 'Russ';
SET @sqlquery = 'if not exists (select * from sysobjects where name=''' + @tableName + ''' and xtype=''U'') 
    begin 
        create table ' + @tableName + '([ID] [bigint] PRIMARY KEY NOT NULL DEFAULT (NEXT VALUE FOR dbo.standardsequence), [Name One] [nvarchar](64) NOT NULL, [Name Two] [nvarchar](64) NOT NULL) 
    end';

exec sp_executesql @sqlquery;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...