我很难尝试分配字段名称,然后将其放入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
......没有工作......
答案 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