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

时间:2015-03-07 23:18:12

标签: tsql variables select local

我很难尝试分配字段名称,然后将其放入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

......没有工作......

2 个答案:

答案 0 :(得分:1)

您的基本问题是在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中的循环。你实际上不需要它。


*可以将数据评估为具有EXEC()等特殊函数的SQL,但这些都是例外。无论如何,数据必须作为整个语句而不是片段进行评估。

答案 1 :(得分:0)

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

更改

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