#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. Возможно, у вас есть кавычки в именах схем? Вы можете это проверить?