我编写了一个将传递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
我也不能使用存储过程,因为使用函数是我的要求。
答案 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