Tsql 我怎样才能解决这个问题?

Tsql 我怎样才能解决这个问题?,tsql,Tsql,我有一个表,包括1列ID和12列Month01到Month12。如果我有一个参数@month=9,那么在没有Month10、Month11、Month12的情况下,我如何比较得到Month01到Month09列。请帮帮我 您也可以尝试一下: DECLARE @month int = 9 DECLARE @Sql nvarchar(100) ='' DECLARE @pos int = 1 WHILE(@pos <= @month) BEGIN SET @Sql = @Sql + (

我有一个表,包括1列ID和12列Month01到Month12。如果我有一个参数@month=9,那么在没有Month10、Month11、Month12的情况下,我如何比较得到Month01到Month09列。请帮帮我

您也可以尝试一下:

DECLARE @month int  = 9
DECLARE @Sql nvarchar(100) =''
DECLARE @pos int = 1
WHILE(@pos <= @month)
BEGIN
   SET @Sql = @Sql + (',month' + right('00'+ rtrim(@pos), 2)) 
   SET @pos = @pos + 1
END
SET @Sql= 'SELECT ID ' +@Sql + ' FROM table'
EXEC sp_executesql @Sql

Simo的答案更为优雅,但下面是实现这一点的另一种基本方法:

声明@month INT 设置@month=9 如果@Month=1 开始 选择Id,01月 来自MonthlyData 终止 如果@Month=2 开始 选择Id、Month01、Month02 来自MonthlyData 终止 -重复3-9个月 如果@Month=9 开始 选择Id、Month01、Month02、Month03、Month04、, 05月、06月、07月、08月、09月 来自MonthlyData 终止 -重复10-12个月 请参阅我的。

是否应该筛选对象id上的sys.columns?如果另一个表有一个名为MonthValue的列,该怎么办?
DECLARE @month int
DECLARE @tableName nvarchar(128)

SET @month = 9;
SET @tableName = 'months' -- YOUR TABLE's NAME

DECLARE @query nvarchar(2048)
SET @query = 
'SELECT id, ' + STUFF((SELECT DISTINCT ', ' + name 
   FROM sys.columns WHERE name LIKE'Month%' 
   AND object_id = OBJECT_ID(@tableName)
   AND CONVERT(INT, RIGHT(name, 2)) <= @month 
   FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'') 
   + ' FROM ' + @tableName;  

EXEC(@query)
declare @str varchar(1000)

SELECT @str= coalesce(@str + ', ', '') + a.name 
FROM (
      Select name from sys.columns
      where object_id = OBJECT_ID('table_months')
      and isnumeric(right(name,2))= 1 and name like 'month%'
      and cast(right(name,2) as int) < '03') a
declare @sql  nvarchar(100)

set @sql = 'select ID, '+ @str+' from table_months'

exec sp_executesql @sql