Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql 创建需要多个参数的表值函数_Tsql - Fatal编程技术网

Tsql 创建需要多个参数的表值函数

Tsql 创建需要多个参数的表值函数,tsql,Tsql,我需要一些关于t-sql代码的帮助。背景我有一个表,可以按列按年份输出数据。因此,单行将包含CN[第0年]……CN[第10年]、保费[第0年]……第10年]等。我试图编写一个函数,该函数采用整数参数,然后仅返回指定年份列的表,即CN,Premium等。最终,我希望在某个时候连接表。我有手动运行代码的基本知识,但不确定如何自动化我的函数,以便它可以返回表 目前,我可以在 ---从这里 ---到这里 手动但不自动执行代码,以便返回表 CREATE FUNCTION [xxxxxxx_Price_Sc

我需要一些关于t-sql代码的帮助。背景我有一个表,可以按列按年份输出数据。因此,单行将包含CN[第0年]……CN[第10年]、保费[第0年]……第10年]等。我试图编写一个函数,该函数采用整数参数,然后仅返回指定年份列的表,即CN,Premium等。最终,我希望在某个时候连接表。我有手动运行代码的基本知识,但不确定如何自动化我的函数,以便它可以返回表

目前,我可以在 ---从这里 ---到这里 手动但不自动执行代码,以便返回表

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