如何在SQL SERVER中传递返回TABLE的SELECT FUNCTION中的@param值?

时间:2016-02-04 15:20:30

标签: sql-server function select

我想将一个param值传递给sql server中的一个函数。

CREATE FUNCTION dbo.MyFunc(@param varchar(30))
RETURNS TABLE
AS
RETURN(
     SELECT @param FROM MyTable
)
GO;

有人能帮助我吗? 我需要使用一个函数来做。 感谢

我已经考虑过解决方法和exec,但是需要一个函数而不是一个过程,因为那时我想在函数和其他表的结果之间进行连接。 类似的东西:

SELECT * FROM MyFunction ('column1, column2, column3, columnN, etc') MyTable INNER JOIN ON (....);

程序对我不起作用加入其他表格。

另外,,,,并不总是要选择三个值,所以我不设置表结构。

Sometimes it will be:
id column1  column2
1  value1   value1.2
2  value2   value2.2

Sometimes it will be:
id column1  column2   column3
1  value1   value1.2  value1.3
2  value2   value2.2  value2.3

1 个答案:

答案 0 :(得分:0)

你不能参数化列名(或表名),所以做这种事的唯一方法是使用动态Sql。
这也意味着您不能使用用户定义的表函数来执行此操作,因为这需要返回硬编码的明确定义的表。

但是,您可以使用存储过程来执行此类操作:

CREATE PROCEDURE SELECT_FROM_TABLE
(
    @ColumnName sysname,
    @TableName sysname
)
AS

DECLARE @Sql varchar(max)

SELECT @Sql = 'SELECT '+ @ColumnName +' FROM '+ @TableName

EXEC(@Sql)

GO

注意:此类程序应从不在数据库之外公开。原因是Sql injection attacks.

的风险是 HUGH

如果你决定创建这样的程序,你必须验证存储过程本身内部的输入。这样的事情应该让你开始:

CREATE PROCEDURE SELECT_FROM_TABLE
(
    @ColumnName sysname,
    @TableName sysname
)
AS

IF EXISTS(
    SELECT 1
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE COLUMN_NAME = @ColumnName 
    AND TABLE_NAME = @TableName 
)
BEGIN

    DECLARE @Sql varchar(max) = 'SELECT '+ @ColumnName +' FROM '+ @TableName
    EXEC(@Sql)

END

GO

这样,您可以确保传递给过程的列名和表名实际存在于数据库中。