SQL-Server Динамический SQL не работает - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть хранимая процедура, которая динамически генерирует таблицу для хранения промежуточных данных для импорта.Эта процедура работала нормально до среды.Я отследил это до одной конкретной области.Код, вызывающий проблему:

DECLARE @strSQL NVARCHAR(MAX) = N'';

SELECT  @strSQL = @strSQL + N',[' + CustomerField + N'] NVARCHAR(MAX)' + CHAR(10)
  FROM  dbo.WebServices
 WHERE  CallType = 'customer'
   AND  IsPrimaryTable = 1
   AND  Source = 'clientName'
 ORDER BY TagOrder;

SET @strSQL = STUFF(@strSQL, 1, 1, 'CREATE TABLE ' + 'TableName' + CHAR(10) + '(')+ N')';

PRINT @strSQL

Примечание.Таблица, из которой она извлекается, содержит список столбцов, и данные также не изменились.Существует около 34 строк данных без специальных символов, и они не доступны для клиентов.

Это дает мне вывод:

CREATE TABLE TableName
([CUSACNR2] NVARCHAR(MAX)
)

Запуск этого на том же самомданные даже в том же окне в SSMS с дополнительным фильтром TOP дают ожидаемые результаты, т.е.

DECLARE @strSQL NVARCHAR(MAX) = N'';

SELECT  TOP (99999) @strSQL = @strSQL + N',[' + CustomerField + N'] NVARCHAR(MAX)' + CHAR(10)
  FROM  dbo.WebServices
 WHERE  CallType = 'customer'
   AND  IsPrimaryTable = 1
   AND  Source = 'clientName'
 ORDER BY TagOrder;

SET @strSQL = STUFF(@strSQL, 1, 1, 'CREATE TABLE ' + 'TableName' + CHAR(10) + '(')+ N')';

PRINT @strSQL

. Генерирует динамический SQL:

CREATE TABLE TableName
([TAG] NVARCHAR(MAX)
,[CUSACNR] NVARCHAR(MAX)
.
.
.
,[SHIPPING_POSTAL_CODE] NVARCHAR(MAX)
,[CUSACNR2] NVARCHAR(MAX)
)

Хотя я отслеживал это в одном конкретном хранимом процессе, мы часто используем этот метод для построения динамического SQL, и я вижу ошибки, появляющиеся во многих местах.Я предполагаю, что что-то изменилось на сервере, поскольку это начало происходить в нескольких базах данных одновременно.

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

1 Ответ

0 голосов
/ 15 февраля 2019

Я нашел ответ.Вроде, как бы, что-то вроде.Теперь я знаю, что изменилось, поэтому я смог исправить это, но это не должно было иметь никакого значения.

В таблице был индекс, который вызывал проблему.Прежде чем вы скажете, что это не должно иметь никакого значения, и вы правы, это не должно, мне удалось надежно решить и воспроизвести проблему, удалив и воссоздав индекс.

Так что это не такпроблема фрагментации, это не кластеризованный индекс, и план выполнения не выполняет поиск по этому индексу в любом случае.

CREATE NONCLUSTERED INDEX [idx_ntindex] ON [dbo].[WebServices] ([Source], [CallType], [SecurityKey])

GO

DECLARE @strSQL NVARCHAR(MAX) = N'';

SELECT  @strSQL = @strSQL + N',[' + ISNULL(CustomerField,'') + N'] NVARCHAR(MAX)' + CHAR(10)
  FROM  dbo.WebServices
 WHERE  CallType = 'customer'
   AND  IsPrimaryTable = 1
   AND  Source = 'clientName'
  ORDER BY TagOrder;

SET @strSQL = STUFF(@strSQL, 1, 1, 'CREATE TABLE ' + 'TableName' + CHAR(10) + '(') + N')';

PRINT @strSQL;

GO

DROP INDEX idx_ntindex ON dbo.WebServices

DECLARE @strSQL NVARCHAR(MAX) = N'';

SELECT  @strSQL = @strSQL + N',[' + ISNULL(CustomerField,'') + N'] NVARCHAR(MAX)' + CHAR(10)
  FROM  dbo.WebServices
 WHERE  CallType = 'customer'
   AND  IsPrimaryTable = 1
   AND  Source = 'clientName'
  ORDER BY TagOrder;

SET @strSQL = STUFF(@strSQL, 1, 1, 'CREATE TABLE ' + 'TableName' + CHAR(10) + '(') + N')';

PRINT @strSQL;

Дает мне результаты

CREATE TABLE TableName
([CUSACNR2] NVARCHAR(MAX)
)

CREATE TABLE TableName
([TAG] NVARCHAR(MAX)
,[CUSACNR] NVARCHAR(MAX)
,[DDAYS] NVARCHAR(MAX)
.
.
.
,[SHIPPING_POSTAL_CODE] NVARCHAR(MAX)
,[CUSACNR2] NVARCHAR(MAX)
)

Если кто-то знает ПОЧЕМУ В таком случае, пожалуйста, дайте мне знать.Я нашел это, но это не имеет никакого смысла для меня.

Спасибо за помощь всем.+1 за всю поддержку, каждое предложение сближало меня.

...