TSQL从函数/过程中选择所有不带前n的列

TSQL从函数/过程中选择所有不带前n的列,sql,tsql,sql-server-2005,unpivot,Sql,Tsql,Sql Server 2005,Unpivot,我知道这听起来很傻,但我想创建一个函数来处理来自不同大小表的数据 假设我有这样的第一张桌子: ID IRR M0 M1 ---------------------- 1 0 -10 5 2 0 -20 10 3 0 -100 100 4 0 -10 0 ID IRR M0 M1 M2 ---------------------------- 1

我知道这听起来很傻,但我想创建一个函数来处理来自不同大小表的数据

假设我有这样的第一张桌子:

ID    IRR     M0    M1
----------------------
 1      0    -10     5
 2      0    -20    10
 3      0   -100   100
 4      0    -10     0
ID    IRR     M0    M1    M2
----------------------------
 1      0    -10     5    60
 2      0    -20    10     0
 3      0   -100   100   400
 4      0    -10     0    10
第二张表是这样的:

ID    IRR     M0    M1
----------------------
 1      0    -10     5
 2      0    -20    10
 3      0   -100   100
 4      0    -10     0
ID    IRR     M0    M1    M2
----------------------------
 1      0    -10     5    60
 2      0    -20    10     0
 3      0   -100   100   400
 4      0    -10     0    10
我想创建一个能够处理两个表中数据的函数

我知道第一列包含ID,第二列包含IRR,其余列将包含特定月份的现金流

函数应该能够处理所有列而不是前2列,并将结果存储在第二列中

我知道我可以通过以下方法从特定表中获取所有列:

SELECT COLUMN_NAME 
FROM INFORMATION_SCHEMA.columns 
WHERE TABLE_NAME = 'First_Table'
当我想要创建将这些列作为行返回的函数时,问题就开始了

我可以创建如下函数:

CREATE FUNCTION UnpivotRow (@TableName  varchar(50), @FromWhichColumn int, @Row int)
RETURNS @values TABLE
(
    id INT IDENTITY(0, 1),
    value DECIMAL(30, 10)
)
...
但是这个函数应该是什么样子呢

我认为这种处理表的理想情况如下所示:

ProjectID    TimePeriod    Value
--------------------------------
        1             0      -10
        1             1        5
        2             0      -20
        2             1       10
        3             0     -100
        3             1      100
        4             0      -10
        4             1        0
我需要在不知道列数的情况下取消整张表。


编辑:
如果无法在函数内部执行此操作,则可能在过程内部执行此操作?

可以使用动态SQL执行以下操作:


此解决方案必须放在存储过程中

通用解决方案需要函数中不允许的动态SQL。如果表的数量有限,您可以对每种情况进行硬编码。然后可能是一个过程?我不想将此限制为2或3个表,我希望有一个通用的解决方案。如何确定
timeperiod
字段?@bluefeet-timeperiod=0表示M0,1表示M1。。。n代表M(n)。我的表的列总是从M0开始,然后增加1,但是可以有30、50或更多列。所有这些都取决于需求。请快速回答:)我需要的是将表名作为参数传递。谢谢