【问题标题】:Naming a Column using Variable使用变量命名列
【发布时间】:2019-08-16 11:40:48
【问题描述】:

我希望在一系列游戏中为所有玩家计算 Ascending Points Diff。我希望第一列名称 PD1 具有最少的点差,PD2 次之,依此类推。我希望使用一个变量来执行此操作,该变量仅根据游戏数量将整数添加到“PD”的末尾。当我将 AS @ColumnName 添加到计算的末尾时,我不断收到错误。

USE [Rugby Pools]


DECLARE @counter int
DECLARE @MaxPlayer int
DECLARE @ColumnName varchar(50)

SET @counter = (SELECT MIN([Player_ID]) FROM [dbo].[Players])
SET @MaxPlayer = (SELECT MAX([Player_ID]) FROM [dbo].[Players])


DECLARE @gamecounter int
DECLARE @MaxGame int
SET @gamecounter = (SELECT MIN([Game_ID]) FROM [dbo].[Match])
SET @MaxGame = (SELECT MAX([Game_ID]) FROM [dbo].[Match])
SET @ColumnName='PD'+@gamecounter

WHILE @gamecounter <= @MaxGame

BEGIN


WHILE @counter <= @MaxPlayer

BEGIN



SELECT     TOP (@gamecounter)   dbo.Players.Player_ID, dbo.Entries.Game_ID, ABS(ABS(dbo.Entries.Home_Score-dbo.Entries.Away_Score)-(dbo.Match.Home_Score-dbo.Match.Away_Score)) AS @ColumnName
FROM            Entries INNER JOIN
                         Match ON Entries.Game_ID = Match.Game_ID INNER JOIN
                         Players ON Entries.Player_ID = Players.Player_ID

                         WHERE dbo.Match.Home_Score IS NOT NULL AND dbo.Players.Player_ID=@counter

                         ORDER BY Players.Player_ID, PointsDiff1 ASC

SET @Counter += 1

                         END                        

SET @gamecounter += 1

END 

一旦工作,我将能够对其进行更改以更新表格,这将允许我提供由获胜决定的球员联赛表格,然后是比赛过程中的最佳分差。

【问题讨论】:

  • 你不能使用变量作为对象名称..(列和表)你需要 dinamyc sql
  • 您使用的是哪个 dbms? (上面的代码是非常具体的产品。)
  • 动态 SQL 可用于实现跳舞的列名,但通常使用数据的代码不会从不断变化的列名中受益。为什么你认为这会简化事情?也许有更好的方法来解决更大的问题。

标签: sql-server tsql variables columnname


【解决方案1】:

像这样将您的最终查询部分更改为动态 sql。只有动态sql才能实现。

 declare @query nvarchar(max)
 set @query = ' SELECT TOP (' + cast(@gamecounter as varchar(10)) + ') dbo.Players.Player_ID, 
               dbo.Entries.Game_ID, ABS(ABS(dbo.Entries.Home_Score-dbo.Entries.Away_Score)-(dbo.Match.Home_Score-dbo.Match.Away_Score)) AS ' + QUOTENAME(@ColumnName) + '
    FROM            Entries INNER JOIN
                             Match ON Entries.Game_ID = Match.Game_ID INNER JOIN
                             Players ON Entries.Player_ID = Players.Player_ID

                             WHERE dbo.Match.Home_Score IS NOT NULL AND dbo.Players.Player_ID= ' + cast(@counter as varchar(10)) + '
                             ORDER BY Players.Player_ID, PointsDiff1 ASC'

  sp_executesql @query

【讨论】:

  • 提示:将对象名称组装成动态 SQL 语句时的最佳做法是使用 QuoteName() 以避免出现奇怪名称的问题,例如New Table 带有空格或保留字,例如 From
  • 感谢您的帮助。抱歉,回复缓慢,我因病长期外出。希望再次得到一匹非常小的马的备份。
猜你喜欢
  • 2022-06-11
  • 2017-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多