Ошибка синтаксиса запроса обновления T-SQL

#sql #sql-server #tsql

#sql #sql-сервер #tsql

Вопрос:

У меня есть этот простой запрос :-

 update [Schema1].ReportData 
set Qry = 'declare @cols nvarchar(max) select @cols = ''Code,Name,DateOfJoining''' 
where ViewName = 'Rpt1'
  

Но вот в чем проблема. У меня более 50 схем, поэтому я сделал следующее
(обобщенный SQL):

 WHILE (@i <= (SELECT MAX(idx) FROM @schema_table))
    BEGIN

        -- get the next record primary key
        SET @schema_names = (SELECT schema_names FROM @schema_table WHERE idx = @i)

        BEGIN TRY
            DECLARE @sSQL nvarchar(500);            
            SELECT @sSQL = N'update ' @schema_names '.ReportData set Qry='declare @cols nvarchar(max) select @cols = ''Code,FName,DateOfJoining ,CategoryName''' where  ViewName='Rpt1''
            EXEC sp_executesql @sSQL
        END TRY
        BEGIN CATCH
            SELECT ERROR_MESSAGE() ' ' @schema_names AS ErrorMessage;
        END CATCH

        -- increment counter for next record
        SET @i = @i   1
    END
  

Но выдает мне синтаксическую ошибку в этой строке :-

 SELECT @sSQL = N'update ' @schema_names '.ReportData set Qry='declare @cols nvarchar(max) select @cols = ''Code,FName,DateOfJoining ,CategoryName''' where  ViewName='Rpt1''
  

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

Комментарии:

1. изменить на: ВЫВЕСТИ ERROR_MESSAGE() ‘ ‘ @schema_names КАК сообщение об ошибке;? Проблема все еще доступна?

2. @starko Я тебя не понял?

3. Ваше ОБНОВЛЕНИЕ перепутано, что вы пытаетесь сделать?

4. Пытался заставить этот синтаксис работать, но все, что вы делаете, выбирая это значение для @cols , вам действительно следует уточнить.

5. Я сохраняю запросы в базе данных для своего приложения amp; Qry — это столбец, в котором я сохраняю запросы.

Ответ №1:

Надеюсь, что я правильно понял ваше заявление об ОБНОВЛЕНИИ:

 SELECT @sSQL = N'update ' QUOTENAME(@schema_names) '.ReportData 
set Qry=''declare @cols nvarchar(max) select @cols = ''''Code,FName,DateOfJoining ,CategoryName''''''
where  ViewName=''Rpt1'''
  

Если вы работаете с любым объектом БД, лучше использовать QUOTENAME

Возвращает строку в Юникоде с добавленными разделителями, чтобы сделать входную строку допустимым идентификатором с разделителями SQL Server.

Приведет к выполнению этого запроса:

 update [Schema1].ReportData 
set Qry='declare @cols nvarchar(max) select @cols = ''Code,FName,DateOfJoining ,CategoryName'''
where  ViewName='Rpt1'
  

Таким образом, после запуска этого пакета Qry будет равно этому:

 declare @cols nvarchar(max) select @cols = 'Code,FName,DateOfJoining ,CategoryName'
  

Редактировать

Еще один способ — использовать CHAR(39) (одинарная кавычка):

 SELECT @sSQL = N'update ' QUOTENAME(@schema_names) '.ReportData 
set Qry= ' CHAR(39)  'declare @cols nvarchar(max) select @cols = ' CHAR(39)  CHAR(39) 'Code,FName,DateOfJoining ,CategoryName'  CHAR(39)  CHAR(39)   CHAR(39)   '
where  ViewName='  CHAR(39) 'Rpt1'  CHAR(39)
  

Комментарии:

1. Та же реализация, что и у меня, но я приветствую хорошее использование QUOTENAME() .

2. Я попробовал оба примера. но все еще получаю ошибку с незакрытыми кавычками.

3. Unclosed quotation mark after the character string .. какая именно строка? Пожалуйста, уточните. Возможно, вы уже получили [] в начале / конце имен вашей схемы?

4. Возможно, у вас есть кавычки в именах схем? Вы можете это проверить?