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