在 case 语句中使用局部变量

Using local variable within case statement

我正在尝试确定 @pi_included_columns 中的任何列是否为 LOB。如果我不使用局部变量 (@included_columns),下面的查询将起作用。但是,如果我只使用

PRINT @included_columns 

并将相同的结果插入 case 语句中 @included_columns 变量所在的位置,它将起作用。为什么 WHERE 子句中不接受变量?

我认为它可能适用于 Dynamic 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

您不能使用逗号分隔的字符串和 in 表达式来匹配字符串中的值。

您可以创建一个动态查询来使用其中的字符串,但这意味着您必须将整个查询放在一个字符串中。相反,您可以将字符串中的项目分成一组,例如 table 变量:

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_variablein 运算符一起使用:

and COLUMN_NAME in (select name from @new_variable)