我想将一个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
答案 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
这样,您可以确保传递给过程的列名和表名实际存在于数据库中。