将表作为参数传递到SQL Server UDF中

我想将表格作为参数传递给定标器UDF。


我还希望将参数限制为仅包含一列的表。(可选的)


这可能吗?


编辑


我不想传递表名,我想传递数据表(我想作为参考)


编辑


我希望我的Scaler UDF基本上取一个值表并返回行的CSV列表。


IE浏览器


col1  

"My First Value"  

"My Second Value"

...

"My nth Value"

会回来


"My First Value, My Second Value,... My nth Value"

我想对表格进行一些过滤,IE确保没有空值并确保没有重复项。我期待着以下方面的事情:


SELECT dbo.MyFunction(SELECT DISTINCT myDate FROM myTable WHERE myDate IS NOT NULL)


慕侠2389804
浏览 682回答 3
3回答

慕勒3428872

不幸的是,SQL Server 2005中没有简单的方法。尽管如此,Lukasz的答案对于SQL Server 2008是正确的,而且该功能早就该了。任何解决方案都将涉及临时表,或者传入xml / CSV并在UDF中进行解析。示例:更改为xml,在udf中解析DECLARE @psuedotable xmlSELECT    @psuedotable = ...FROM    ...FOR XML ...SELECT ... dbo.MyUDF (@psuedotable)不过,您想在更大范围内做什么?可能还有另一种方式可以做到这一点...编辑:为什么不以字符串形式传递查询,并使用带有输出参数的存储过程注意:这是未经测试的代码,您需要考虑SQL注入等。但是,它也满足您的“单列”要求,并且应该对您有所帮助CREATE PROC dbo.ToCSV (    @MyQuery varchar(2000),    @CSVOut varchar(max))ASSET NOCOUNT ONCREATE TABLE #foo (bar varchar(max))INSERT #fooEXEC (@MyQuery)SELECT    @CSVOut = SUBSTRING(buzz, 2, 2000000000)FROM    (    SELECT         bar -- maybe CAST(bar AS varchar(max))??    FROM         #foo    FOR XML PATH (',')    ) fizz(buzz)GO

波斯汪

您可以,但是没有任何表格。从文档:对于Transact-SQL函数,允许所有数据类型,包括CLR用户定义类型和用户定义表类型,但时间戳数据类型除外。您可以使用用户定义的表类型。用户定义表类型的示例:CREATE TYPE TableType AS TABLE (LocationName VARCHAR(50))GO DECLARE @myTable TableTypeINSERT INTO @myTable(LocationName) VALUES('aaa')SELECT * FROM @myTable因此,您可以做的是定义表类型,例如TableType定义使用该类型参数的funcion示例函数:CREATE FUNCTION Example( @TableName TableType READONLY)RETURNS VARCHAR(50)ASBEGIN    DECLARE @name VARCHAR(50)    SELECT TOP 1 @name = LocationName FROM @TableName    RETURN @nameEND该参数必须为READONLY。用法示例:DECLARE @myTable TableTypeINSERT INTO @myTable(LocationName) VALUES('aaa')SELECT * FROM @myTableSELECT dbo.Example(@myTable)根据您要实现的目标,可以修改此代码。编辑: 如果您在表中有一个数据,您可以创建一个变量:DECLARE @myTable TableType并从表中获取数据到变量INSERT INTO @myTable(field_name)SELECT field_name_2 FROm my_other_table

尚方宝剑之说

第1步:创建一个名为TableType的表类型,该表将接受具有一个varchar列的表create type TableTypeas table ([value] varchar(100) null)步骤2:创建一个函数,该函数将上面声明的TableType用作表值参数,并将字符串值作为分隔符create function dbo.fn_get_string_with_delimeter (@table TableType readonly,@Separator varchar(5))returns varchar(500)Asbegin    declare @return varchar(500)    set @return = stuff((select @Separator + value from @table for xml path('')),1,1,'')    return @returnend步骤3:将具有一个varchar列的表传递给用户定义的类型TableType,并在函数中使用“,”作为分隔符select dbo.fn_get_string_with_delimeter(@tab, ',')
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

SQL Server