为什么我在T-SQL中有两个不同的返回值

时间:2014-11-13 11:39:41

标签: sql sql-server tsql

您好我想知道为什么我有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

此查询确切地告诉我它应该是什么。

我希望你们能提供帮助。

干杯史蒂文

3 个答案:

答案 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中,您将返回该变量的值,而不是表中的列。