是否可以将表作为参数传递给SQL ADW中将在函数内部查询的用户定义函数?

时间:2019-05-13 20:57:57

标签: sql azure-sql-data-warehouse

我正在为Azure数据仓库编写CREATE TABLE脚本,该脚本将重新创建分区表的架构。我的脚本具有重复代码,该代码可查询表并从列值创建逗号分隔的字符串。我正在尝试将此重复代码移到一个单独的函数中,以便可以重复使用。

CREATE FUNCTION [dbo].[fnCreateStringFromColValues] (
    @tblName [NVARCHAR](255)
    , @colName [NVARCHAR](255) 
    , @RNumColName [NVARCHAR](255)
)
RETURNS VARCHAR(MAX)
AS
BEGIN 

    DECLARE @nRows INT = (SELECT count(*) FROM @tblName)
    DECLARE @count INT = 1
    DECLARE @toReturn AS nvarchar(MAX) = ''

    WHILE (@count <= @nRows)
    BEGIN
        DECLARE @column varchar(200) = (SELECT @colName FROM @tblName WHERE @RNumColName = @count1)
        SET @toReturn = @toReturn + @column + ','
        SET @count = @count + 1
    END
    RETURN @toReturn
END

在网上搜索后,我仍然不确定用户定义的功能如何工作以及是否可以实现我想做的事情。可以动态传递@tblName吗?我可以在函数内部查询传递的表吗?现在,尝试创建此函数时出现以下错误 “在第16行,第22列,第45行解析错误:'@ tblName'附近的语法不正确。”

1 个答案:

答案 0 :(得分:0)

Azure SQL数据仓库不支持表值参数,但截至2019年7月,它确实支持功能强大的字符串处理功能STRING_AGGSTRING_SPLIT。因此,无需创建用户定义的函数,只需使用内置函数即可。

一个简单的示例,目前可以在Azure SQL数据仓库中使用:

SELECT object_id, STRING_AGG( name, ', ' ) colList
FROM sys.columns
GROUP BY object_id