为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕侠2389804 2019-12-02 12:59:17
我想将表格作为参数传递给定标器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)
查看完整描述

3 回答

?
慕勒3428872

TA贡献1848条经验 获得超6个赞

不幸的是,SQL Server 2005中没有简单的方法。尽管如此,Lukasz的答案对于SQL Server 2008是正确的,而且该功能早就该了。


任何解决方案都将涉及临时表,或者传入xml / CSV并在UDF中进行解析。示例:更改为xml,在udf中解析


DECLARE @psuedotable xml


SELECT

    @psuedotable = ...

FROM

    ...

FOR XML ...


SELECT ... dbo.MyUDF (@psuedotable)

不过,您想在更大范围内做什么?可能还有另一种方式可以做到这一点...


编辑:为什么不以字符串形式传递查询,并使用带有输出参数的存储过程


注意:这是未经测试的代码,您需要考虑SQL注入等。但是,它也满足您的“单列”要求,并且应该对您有所帮助


CREATE PROC dbo.ToCSV (

    @MyQuery varchar(2000),

    @CSVOut varchar(max)

)

AS

SET NOCOUNT ON


CREATE TABLE #foo (bar varchar(max))


INSERT #foo

EXEC (@MyQuery)


SELECT

    @CSVOut = SUBSTRING(buzz, 2, 2000000000)

FROM

    (

    SELECT 

        bar -- maybe CAST(bar AS varchar(max))??

    FROM 

        #foo

    FOR XML PATH (',')

    ) fizz(buzz)

GO


查看完整回答
反对 回复 2019-12-02
?
波斯汪

TA贡献1811条经验 获得超4个赞

您可以,但是没有任何表格。从文档:


对于Transact-SQL函数,允许所有数据类型,包括CLR用户定义类型和用户定义表类型,但时间戳数据类型除外。


您可以使用用户定义的表类型。


用户定义表类型的示例:


CREATE TYPE TableType 

AS TABLE (LocationName VARCHAR(50))

GO 


DECLARE @myTable TableType

INSERT INTO @myTable(LocationName) VALUES('aaa')

SELECT * FROM @myTable

因此,您可以做的是定义表类型,例如TableType定义使用该类型参数的funcion示例函数:


CREATE FUNCTION Example( @TableName TableType READONLY)

RETURNS VARCHAR(50)

AS

BEGIN

    DECLARE @name VARCHAR(50)


    SELECT TOP 1 @name = LocationName FROM @TableName

    RETURN @name

END

该参数必须为READONLY。用法示例:


DECLARE @myTable TableType

INSERT INTO @myTable(LocationName) VALUES('aaa')

SELECT * FROM @myTable


SELECT dbo.Example(@myTable)

根据您要实现的目标,可以修改此代码。


编辑: 如果您在表中有一个数据,您可以创建一个变量:


DECLARE @myTable TableType

并从表中获取数据到变量


INSERT INTO @myTable(field_name)

SELECT field_name_2 FROm my_other_table


查看完整回答
反对 回复 2019-12-02
?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

第1步:创建一个名为TableType的表类型,该表将接受具有一个varchar列的表


create type TableType

as table ([value] varchar(100) null)

步骤2:创建一个函数,该函数将上面声明的TableType用作表值参数,并将字符串值作为分隔符


create function dbo.fn_get_string_with_delimeter (@table TableType readonly,@Separator varchar(5))

returns varchar(500)

As

begin


    declare @return varchar(500)


    set @return = stuff((select @Separator + value from @table for xml path('')),1,1,'')


    return @return


end

步骤3:将具有一个varchar列的表传递给用户定义的类型TableType,并在函数中使用“,”作为分隔符


select dbo.fn_get_string_with_delimeter(@tab, ',')


查看完整回答
反对 回复 2019-12-02
  • 3 回答
  • 0 关注
  • 681 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信