在SQL函数

时间:2019-05-21 02:25:27

标签: sql-server

我编写了一个将传递1个字符串参数的函数。如您所见,在该函数内部应该获取该字符串,但由于我传递的参数是字符串,因此该字符串不起作用。如果我将列名以其格式编写,参数的接收者应该获取列名,但它可以正常工作,但我需要通过。

这是我传递的字符串:

[Where], [University], [BeginDate], [GraduateDate], [Major]

现在这是功能

DROP FUNCTION NewTable
GO
CREATE FUNCTION NewTable
     (@PassParameter NVARCHAR(MAX))
RETURNS TABLE 
AS
    RETURN  
        SELECT * 
        FROM 
            (SELECT O.RowIndex, O.OptionValue, T.TypeValue
             FROM Options O
             LEFT OUTER JOIN Types T ON T.TypeID = O.TypeID
             GROUP BY O.RowIndex, O.OptionValue, T.TypeValue) d
        PIVOT
        (   
            MAX(OptionValue)
            FOR [TypeValue] IN (@PassParameter) <-- this is tricky part this will not work but I put this [Where], [University], [BeginDate], [GraduateDate], [Major] this is gonna work
        ) PIV

GO

我也不能使用存储过程,因为使用函数是我的要求。

1 个答案:

答案 0 :(得分:0)

用户定义的函数中不能包含动态sql。如果要具有这种功能,则可以定义CLR用户定义的功能。

相反,您可以使用动态sql定义存储过程,并将存储过程的输出插入表类型中。

我已提供样品供您参考。

首先定义一个用户定义的表类型

CREATE TYPE RowIndex as
Table
(
RowIndex INT,
optionValue VARCHAR(20),
TypeValue VARCHAR(20)
);

接下来用动态sql内容定义存储过程。

CREATE PROCEDURE NewTable
     (@PassParameter NVARCHAR(MAX))
AS
BEGIN
    DECLARE @sql NVARCHAR(MAX);
    SET @sql = 
    '
             SELECT * 
        FROM 
            (SELECT O.RowIndex, O.OptionValue, T.TypeValue
             FROM Options O
             LEFT OUTER JOIN Types T ON T.TypeID = O.TypeID
             GROUP BY O.RowIndex, O.OptionValue, T.TypeValue) d
        PIVOT
        (   
            MAX(OptionValue)
            FOR [TypeValue] IN '+ @PassParameter +' 
        ) PIV

            '
        EXEC sp_Executesql @sql
END
GO

现在,将存储过程的输出插入表类型。

DECLARE @RowIndex RowIndex
INSERT INTO @RowIndex
EXEC NewTable 'Test'
SELECT * FROM @RowIndex