Getting Visual Studio to deploy a UDF to Return NVARCHAR(MAX) I have a SQLCLR stored procedure with the following signature in Visual Studio 2013:

[SqlFunction(DataAccess = DataAccessKind.Read, SystemDataAccess = SystemDataAccessKind.Read)]
public static SqlString ExecSql2Json(SqlString sql)


Or alternatively I've tried:

[SqlFunction(DataAccess = DataAccessKind.Read, SystemDataAccess = SystemDataAccessKind.Read)]
public static SqlChar ExecSql2Json(SqlChar sql)


Either way the parameter and return type gets defined as NVARCHAR(4000). I'd like them to be NVARCHAR(MAX). 

I know I can manually write my own CREATE PROCEDURE statement to have fine grain control. Is there any option anywhere to change the deploy DDL generated by SQL Server or do I just have to manually add a script to drop and read the UDF with the proper signature?
You need to specify a SqlFacet for the return value. This is the same as specifying a SqlFacet for an input parameter, except you prefix it with return:

For (max) length, use MaxSize=-1 in the SqlFacet attribute, example follows: 

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;
    }
}


The T-SQL script generated for this SQLCLR function is:

CREATE FUNCTION [dbo].[ScalarFunction1]
(@input NVARCHAR (MAX))
RETURNS NVARCHAR (MAX)
AS
 EXTERNAL NAME [Library].[UserDefinedFunctions].[ScalarFunction1]