在case语句中使用局部变量

时间:2015-01-15 20:19:25

标签: sql sql-server local-variables

我正在尝试确定@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

1 个答案:

答案 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_variablein运算符一起使用,如下所示:

and COLUMN_NAME in (select name from @new_variable)