从 SELECT 语句中的循环列名变量赋值

Assigning a value from a looped column name variable in a SELECT statement

我很难尝试分配一个字段名称,然后将其放入 T SQL 中的 SELECT 语句中。首先 - 我想让 SELECT 语句在不弹出转换错误的情况下工作,然后我希望将字段值分配给另一个变量。我失败的代码如下。

DECLARE @lid integer
DECLARE @lrid integer
DECLARE @pct integer
DECLARE @rds integer
SET @lid = 4
SET @lrid = 46
SET @pct = 75
SET @rds = 4

DECLARE @c integer --SIMPLE COUNTER
DECLARE @sql nvarchar(999) --RAW SCORE FIELD
DECLARE @cpct float --CALCULATED PERCENT
DECLARE @scrt integer --TOP SCORE
DECLARE @scrf nvarchar(10) --RAW SCORE FIELD
DECLARE @scrr integer --ROUND RAW SCORE
DECLARE @scrs integer --SUMMED RAW SCORE

--SET VARIABLES
SET @cpct = @pct * .01
SET @scrt = (SELECT points FROM league WHERE id = @lid)

--LOOP THROUGH SCORES FROM 1 ON UP
SET @c = 1
SET @scrs = 0
WHILE (@c <= 30)
BEGIN
  SET @scrf = 'round' + CAST(@c AS nvarchar(2))
  SELECT @scrr =(SELECT @scrf FROM league_lineup WHERE id = @lrid)
  SET @scrs = @scrs+@scrr

  IF @c > @rds
    PRINT 'ROUND ' + CAST(@c AS nvarchar(3)) + ' - SCORE: ' + CAST(@scrs AS nvarchar(5))
  SET @c = @c + 1
END

...不起作用....

您的基本问题是在 TSQL 中,数据永远不会被评估为好像它不是数据*。这意味着正在发生的事情类似于以下内容:

SET @c = 25.48;
SET @scrf = 'round' + CAST(@c AS nvarchar(2));

@scrf 的值现在是 'round25.48'。这意味着:

SELECT @scrr = (SELECT @scrf FROM league_lineup WHERE id = @lrid)

相当于:

SELECT @scrr =(SELECT 'round25.48' FROM league_lineup WHERE id = @lrid)

这意味着您正在尝试将字符串 (nvarchar) 'round25.48' 分配给 @scrr,一个整型变量。所以你得到一个转换错误。

你会想做更多类似的事情:

SELECT @scrr = (SELECT ROUND(@c) FROM league_lineup WHERE id = @lrid);

最后,注意 SQL 中的循环。您可能实际上并不需要它。


*数据可以像 SQL 一样被评估,具有像 EXEC() 这样的特殊功能,但那些是例外。无论如何,数据必须作为一个完整的语句而不是一个片段来评估。

在这种情况下,您应该使用带有输出参数的动态查询:

改变

SELECT @scrr =(SELECT @scrf FROM league_lineup WHERE id = @lrid)
SET @scrs = @scrs+@scrr

DECLARE @sql = 'SELECT @scrr = ' + @scrf + ' FROM league_lineup WHERE id = @lrid'    
EXEC sp_executesql @sql, N'@scrr int OUTPUT, @lrid int', @scrr OUTPUT, @lrid    
SET @scrs = @scrs+@scrr