您好我想知道为什么我有2个不同的返回值。 这是第一个查询:
declare @currentcolumn_val varchar
declare @start integer
set @currentcolumn_val = 'state_val'
set @start =1
select @currentcolumn_val from z_skm where id = @start
返回的值只是“s”
这是第二个Query,它给出了正确的返回值:
select state_val from z_skm where id = 1
此查询确切地告诉我它应该是什么。
我希望你们能提供帮助。
干杯史蒂文
答案 0 :(得分:2)
您的第一个查询返回一个常量。第二个是返回列的值。
您将返回's
'因为声明而不是'state_val'
:
declare @currentcolumn_val varchar;
varchar()
上没有长度,在此上下文中,默认长度为1. 始终在SQL Server中使用varchar()
长度。
如果您希望列是动态的,则需要使用动态SQL:
declare @currentcolumn_val nvarchar(255);
declare @start integer;
declare @sql nvarchar(max) = 'select @currentcolumn_val from z_skm where id = @start';
set @sql = replace(@sql, '@currentcolumn_val', @currentcolumn_val);
exec sp_executesql @sql, N'@start int', @start = @start;
您可以将参数作为参数传递,但不能传递列名或表名。
答案 1 :(得分:1)
您已将@currentcolumn_val
简称为varchar
,默认长度为1。
如果将其替换为declare @currentcolumn_val varchar(10)
,您将看到整个值
答案 2 :(得分:0)
首先,您没有为@currentcolumn_val
参数指定大小,因此它等同于VARCHAR(1)
。这意味着:
set @currentcolumn_val = 'state_val'
与...基本相同:
set @currentcolumn_val = 's'
然后在SELECT中,您将返回该变量的值,而不是表中的列。