Tsql 创建需要多个参数的表值函数
我需要一些关于t-sql代码的帮助。背景我有一个表,可以按列按年份输出数据。因此,单行将包含CN[第0年]……CN[第10年]、保费[第0年]……第10年]等。我试图编写一个函数,该函数采用整数参数,然后仅返回指定年份列的表,即CN,Premium等。最终,我希望在某个时候连接表。我有手动运行代码的基本知识,但不确定如何自动化我的函数,以便它可以返回表 目前,我可以在 ---从这里 ---到这里 手动但不自动执行代码,以便返回表Tsql 创建需要多个参数的表值函数,tsql,Tsql,我需要一些关于t-sql代码的帮助。背景我有一个表,可以按列按年份输出数据。因此,单行将包含CN[第0年]……CN[第10年]、保费[第0年]……第10年]等。我试图编写一个函数,该函数采用整数参数,然后仅返回指定年份列的表,即CN,Premium等。最终,我希望在某个时候连接表。我有手动运行代码的基本知识,但不确定如何自动化我的函数,以便它可以返回表 目前,我可以在 ---从这里 ---到这里 手动但不自动执行代码,以便返回表 CREATE FUNCTION [xxxxxxx_Price_Sc
CREATE FUNCTION [xxxxxxx_Price_Schema].get_MultiYear(@year varchar(1))
RETURNS TABLE
AS
RETURN
------from here
declare @year varchar(1);
declare @yearNo varchar(1);
declare @customerNo varchar(25);
declare @CN varchar(3);
declare @SQLString NVARCHAR(max);
declare @SQLResult nvarchar(max);
set @year = 1
set @yearNo = cast(@year as varchar(1))
set @customerNo = QUOTENAME(cast('CustomerNumber[Year '+ @yearNo + ']' as varchar(25)))
set @CN = concat('CN',@yearNo)
set @SQLString =
'
select distinct
[CN[Year '+ @yearNo +']]] AS CN
,[Premium[Year '+ @yearNo + ']]] AS Premium
,[Age[Year '+ @yearNo + ']]] AS Age
,[Sex[Year '+ @yearNo + ']]] AS Sex
FROM [Test].[Test202002].[PHL_MultiYear_Test_Output]
WHERE ' + @customerNo + ' = '''+ @CN + '''
'
EXECUTE sp_executesql @SQLString
----too here
RETURN @SQLString
END
GO
如果我的输入参数为0,则为所需结果
如果没有动态SQL,您将无法获取动态列名。但是,如果您不介意标准化结果,请考虑取消数据< /P> 这可以很容易地合并到表值函数中 范例 更新了奇数列名称 编辑2-变量数据类型
您不能在UDF中使用动态SQL。@johncapelletti您对解决方法有什么建议吗?请提供一组最好作为DDL和DML提供的示例数据-阅读内容和预期输出。。。这可能是一个例子。可能有更好的方法……如果您需要动态sql,那么您必须迁移到存储procedure@Shnugo我拥有的数据是业务敏感的,所以我所能做的最好的事情就是描述我的表结构和要求。模拟表不会比上面所述更具描述性。如果我的列是[CN[0年]、[CN[1年]]等格式,您将如何修改解决方案上的代码点。非常感谢。另一个问题——希望快点。我的某些列的数据存储格式不同,因此我正在获取。-->列Premium[Year 0]的类型与UNPIVOT列表中指定的其他列的类型冲突。任何工作around@project_kingz不同的格式?你指的是不同的数据类型吗?是的,对不起,我指的是不同的数据类型。有些是varchar,有些是intetc@project_kingz今后,请提供适当的数据样本。而不是一个不起眼的人。我们可以通过交叉应用程序取消打印数据。请注意,我们正在将这些列转换为varchar50,但您可以决定什么更合适。下面是一个DBFIDLE,它显示了最终的方法
Declare @Year varchar(1) = '0'
Select SelYear = @Year
,CN = max(case when Item like 'CN%' then Value end)
,Premium = max(case when Item like 'Premium%' then Value end)
From (
Select *
From (Select *
,RN=Row_NUmber() over (Order by (Select null))
From YourTable
Where 1=1 -->>> Put your actual WHERE here <<<--
) src
Unpivot ( Value for Item in ([CN [Year 0]]],[CN [Year 1]]],[Premium [Year 0]]],[Premium [Year 1]]] )) unp -->>> Add 2 through 5 <<<--
Where Item like '%'+@Year+']'
) A
Group By RN
SelYear CN Premium
0 0 10
0 0 20
0 0 30
0 0 40
Select SelYear = @Year
,CN = max(case when Item like 'CN%' then Value end)
,Premium = max(case when Item like 'Premium%' then Value end)
From (
Select *
From (Select *
,RN=Row_NUmber() over (Order by (Select null))
From YourTable
Where 1=1 -->>> Put your actual WHERE here <<<--
) src
Cross Apply ( values ('CN [Year 0]' ,convert(varchar(50),[CN [Year 0]]]) )
,('CN [Year 1]' ,convert(varchar(50),[CN [Year 1]]]) )
,('Premium [Year 0]',convert(varchar(50),[Premium [Year 0]]]) )
,('Premium [Year 1]',convert(varchar(50),[Premium [Year 0]]]) )
)B(Item,Value)
Where Item like '%'+@Year+']'
) A
Group By RN