在 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_variable
与 in
运算符一起使用:
and COLUMN_NAME in (select name from @new_variable)
我正在尝试确定 @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_variable
与 in
运算符一起使用:
and COLUMN_NAME in (select name from @new_variable)