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或更多列。所有这些都取决于需求。请快速回答:)我需要的是将表名作为参数传递。谢谢