Команда динамического SQL не выполняется - PullRequest
0 голосов
/ 20 ноября 2018

Мне нужно конвертировать некоторые таблицы как временные (системные версии).Для этой цели я написал команду SQL, которая будет выполняться динамически.

Запрос не выдает ошибку, но не выполняет команду SQL.Она также не печатает команду, используя «PRINT».

Я читал соответствующие статьи в SO.В соответствии с ними я объявил переменные в скрипте, а также предоставил им sp_executesql.Пожалуйста, сообщите.

DECLARE @sqlCommand nvarchar(2000)
DECLARE @tableName nvarchar(100)


SET @sqlCommand =
'ALTER TABLE ' + @tableName + '
ADD [SysStartTime] DATETIME2
GO

ALTER TABLE ' + @tableName + '
ADD [SysEndTime] DATETIME2
GO

UPDATE ' + @tableName + ' SET [SysStartTime] = ''19000101 00:00:00.0000000'', [SysEndTime] = ''99991231 23:59:59.9999999''
GO

ALTER TABLE ' + @tableName + '
ALTER COLUMN [SysStartTime] DATETIME2 NOT NULL
GO

ALTER TABLE ' + @tableName + '
ALTER COLUMN [SysEndTime] DATETIME2 NOT NULL
GO

ALTER TABLE ' + @tableName + '
ADD PERIOD FOR SYSTEM_TIME ([SysStartTime], [SysEndTime])

ALTER TABLE ' + @tableName + ' SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = [History].ConditionAssessment))
GO'

PRINT @sqlCommand 


EXECUTE sp_executesql @sqlCommand, N'@tableName nvarchar(100)', @tableName = 'ConditionAssessmentData'

1 Ответ

0 голосов
/ 20 ноября 2018

Он не будет ни печататься, ни выполняться, потому что @tableName и @sqlCommand оба null и anything + null = null в T-SQL, поэтому они остаются null.

На самом деле вы не можетев любом случае, делайте то, что хотите, потому что вы можете использовать параметры в том же объеме, что и в динамическом запросе, и это не позволяет вам делать такие вещи, как alter table см. http://www.sommarskog.se/dynamic_sql.html.

Выпотребуется построить всю строку, включая имя таблицы, и не передавать какие-либо параметры в sp_executesql.

Вы также хотели бы тщательно подумать, хотите ли вы предоставить такой мощный и опасный (из-за опасностиSQL инъекций) процедура.

...