让 Visual Studio 部署 UDF 以返回 NVARCHAR(MAX)

Jus*_*ing 2 varchar functions sql-clr visual-studio-2013

我在 Visual Studio 2013 中有一个带有以下签名的 SQLCLR 存储过程:

[SqlFunction(DataAccess = DataAccessKind.Read, SystemDataAccess = SystemDataAccessKind.Read)]
public static SqlString ExecSql2Json(SqlString sql)
Run Code Online (Sandbox Code Playgroud)

或者我已经尝试过:

[SqlFunction(DataAccess = DataAccessKind.Read, SystemDataAccess = SystemDataAccessKind.Read)]
public static SqlChar ExecSql2Json(SqlChar sql)
Run Code Online (Sandbox Code Playgroud)

无论哪种方式,参数和返回类型都被定义为NVARCHAR(4000). 我希望他们成为NVARCHAR(MAX)

我知道我可以手动编写自己的CREATE PROCEDURE语句来进行细粒度控制。是否有任何选项可以更改 SQL Server 生成的部署 DDL,或者我是否只需要手动添加脚本来删除和读取具有正确签名的 UDF?

Pau*_*ite 5

您需要SqlFacet为返回值指定一个。这与为SqlFacet输入参数指定 a 相同,只是您在它前面加上了前缀return:

对于(max)长度,MaxSize=-1SqlFacet属性中使用,示例如下:

using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;

public partial class UserDefinedFunctions
{
    [SqlFunction
        (
        DataAccess=DataAccessKind.None,
        SystemDataAccess=SystemDataAccessKind.None,
        IsDeterministic=true,
        IsPrecise=true
        )
    ]
    [return: SqlFacet(IsFixedLength=false, IsNullable=true, MaxSize=-1)] 
    public static SqlString ScalarFunction1
        (
            [SqlFacet(IsFixedLength=false, IsNullable=true, MaxSize=-1)] 
            SqlString input
        )
    {
        return input;
    }
}
Run Code Online (Sandbox Code Playgroud)

为此 SQLCLR 函数生成的 T-SQL 脚本是:

CREATE FUNCTION [dbo].[ScalarFunction1]
(@input NVARCHAR (MAX))
RETURNS NVARCHAR (MAX)
AS
 EXTERNAL NAME [Library].[UserDefinedFunctions].[ScalarFunction1]
Run Code Online (Sandbox Code Playgroud)