Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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
Sql server 获取参数作为SQL函数中的列名_Sql Server - Fatal编程技术网

Sql server 获取参数作为SQL函数中的列名

Sql server 获取参数作为SQL函数中的列名,sql-server,Sql Server,我编写了一个函数,它将传递一个字符串参数。在该函数中,它应该获得字符串,正如您所看到的,但它不起作用,因为我传递的参数是字符串。参数的接收者假设获得列名,如果我将列名作为其格式写入,那么它工作正常,但我需要获得通过 这是我传递的字符串: [Where], [University], [BeginDate], [GraduateDate], [Major] 这就是函数 DROP FUNCTION NewTable GO CREATE FUNCTION NewTable (@PassPa

我编写了一个函数,它将传递一个字符串参数。在该函数中,它应该获得字符串,正如您所看到的,但它不起作用,因为我传递的参数是字符串。参数的接收者假设获得列名,如果我将列名作为其格式写入,那么它工作正常,但我需要获得通过

这是我传递的字符串:

[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

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

在用户定义的函数中不能有动态sql。如果希望具有此类功能,可以定义CLR用户定义函数

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

我已提供样品供你们参考

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

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

用户定义的函数中不能有动态sql。如果希望具有此类功能,可以定义CLR用户定义函数

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

我已提供样品供你们参考

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

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

完成查询的方法需要动态SQL。但是,不能从函数中执行动态SQL。因此,看起来您必须修改您的需求。完成查询的方法需要动态SQL。但是,不能从函数中执行动态SQL。因此,看起来您必须修改您的需求。