我正在尝试确定@pi_included_columns
中的任何列是否为LOB。如果我不使用局部变量(@included_columns
),下面的查询将起作用。但是,如果我只是使用
PRINT @included_columns
并将相同的结果插入到case语句中@included_columns
变量的位置,它将起作用。为什么WHERE
子句中不接受变量?
我认为它可能适用于动态SQL,但我从未使用过Dynamic而不确定从哪里开始。
DECLARE @offline_flag CHAR(1),-- = 'N',
@pi_table_name varchar(128) = 'ngkbm_default_values_',
@pi_included_columns varchar(1000) = ' table_name, field_name, set_value , sql_count, sql_insert, sql_update',
@included_columns varchar(1000),
@new_variable varchar(1000)
SET @included_columns = replace(@pi_included_columns,',',', ')
SET @included_columns = replace(@included_columns,' ',' ');
SELECT @new_variable = '(''' + REPLACE(REPLACE(@included_columns , ' ' , ''), ',' , ''',''') + ''')'
SELECT @offline_flag =
CASE
WHEN EXISTS (
SELECT 1 FROM information_schema.columns
WHERE (TABLE_NAME = @pi_table_name
AND COLUMN_NAME IN (@new_variable)
AND (data_type IN ('TEXT','NTEXT','IMAGE' ,'XML', 'VARBINARY')
OR (data_type = 'VARCHAR' AND character_maximum_length = -1)
OR (data_type = 'NVARCHAR' AND character_maximum_length = -1))
))
THEN 'Y'
ELSE 'N'
END
print @new_variable
Print @offline_flag
答案 0 :(得分:0)
您不能使用带有in
表达式的逗号分隔字符串来匹配字符串中的值。
您可以创建一个动态查询来使用其中的字符串,但这意味着您必须将整个查询放在一个字符串中。相反,您可以将字符串中的项分隔为一个集合,例如表变量:
declare @pos int
declare @new_variable table(name varchar(100))
set @pos = charindex(',', @pi_included_columns)
while @pos <> 0 begin
insert into @new_variable values (ltrim(rtrim(substring(@pi_included_columns, 1, @pos - 1))))
set @pi_included_columns = substring(@pi_included_columns, @pos + 1, len(@pi_included_columns) - @pos)
set @pos = charindex(',', @pi_included_columns)
end
insert into @new_variable values (ltrim(rtrim(@pi_included_columns)))
现在,您可以将@new_variable
与in
运算符一起使用,如下所示:
and COLUMN_NAME in (select name from @new_variable)