FWIW, при работе с динамическим SQL на лету для производства или генерации кода мне нравится использовать шаблоны, которые немного облегчают обслуживание (обратите внимание, что вы можете вставлять разрывы строк, что тоже хорошо - не забывайте вставить CHAR (13) / CHAR (10) или пробел перед кавычкой):
DECLARE @template AS varchar(max) = '
IF NOT EXISTS (
SELECT {@DescriptionFieldName} -- Note this is unnecessary
FROM {@TableName}
WHERE ({@DescriptionFieldName} = ''{@DescriptionValue}''
)
BEGIN
INSERT INTO {@TableName} ({@DescriptionFieldName}, LastUser, LastUpdate)
VALUES (''{@DescriptionValue}'', ''{@LastUser}'', ''{@LastUpdate}'');
END
'
DECLARE @Query AS varchar(max) = @template
SET @Query = REPLACE(@Query, '{@DescriptionFieldName}', @DescriptionFieldName)
SET @Query = REPLACE(@Query, '{@TableName}', @TableName)
SET @Query = REPLACE(@Query, '{@DescriptionValue}', ISNULL(@DescriptionValue, ''))
SET @Query = REPLACE(@Query, '{@LastUser}', ISNULL(@LastUser, ''))
SET @Query = REPLACE(@Query, '{@LastUpdate}', @LastUpdate)
PRINT @Query
EXEC (@Query)
У вас все еще есть двойные кавычки, но вам не нужно добавлять строки, это очевидно, когда вы забыли заменить параметр, и вы не повторяете вставки в код, когда все должно измениться.
Также обратите внимание, что это может иметь проблему с NULL в @DescriptionValue (ваш оригинал имел ту же проблему в части WHERE в EXISTS)
Обратите внимание, что вы также можете вкладывать свои замены и с соответствующим форматированием, он может даже быть читаемым:
DECLARE @Query AS varchar(max) = @template
SET @Query = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(@Query
,'{@DescriptionFieldName}', @DescriptionFieldName)
,'{@TableName}', @TableName)
,'{@DescriptionValue}', ISNULL(@DescriptionValue, ''))
,'{@LastUser}', ISNULL(@LastUser, ''))
,'{@LastUpdate}', @LastUpdate)