現在、detail属性を持つ1つのテーブルの列のリストを取得する関数があります。もちろん、列がたくさんあるテーブルもあります。したがって、出力は10.000文字を超えます。
ここで私はこのようにテストします:
declare @aa nvarchar(max)
set @aa = dbo.fnGetColumnList('Table_Name')
print @aa
結果は常に約4000文字になります。SQLがそれを切り捨てたようです。
nvarchar(max)を宣言すると、SQLはこの文字列に対して最大2 ^ 32-1(2GB)をサポートすることを私は知っています。しかし、なぜそれはちょうど約4000文字を持っているのですか?
私がこのように実行するとき:
select dbo.fnGetColumnList('Table_Name')
結果は正しいです。
そして、これが関数のコードです:
-- get column list from table Mapping
ALTER FUNCTION [dbo].[fnGetColumnList] ( @tblName varchar (30))
RETURNS nvarchar(max)
AS
BEGIN
Declare @sql nvarchar(max)
set @sql = ''
SELECT @sql = @sql + case
when CHARINDEX('char', LOWER([DBType])) > 0 then ', ['+[DBColumn]+']' + ' ['+[DBType]+']' + ' ('+convert(varchar(10),[Length])+') NULL' + CHAR(13)
when CHARINDEX('char', LOWER([DBType])) > 0 then ', ['+[DBColumn]+']' + ' ['+[DBType]+']' + ' NULL' + CHAR(13)
ELSE ', ['+[DBColumn]+']' + ' ['+[DBType]+']' + ' NULL' + CHAR(13)
end FROM dbo.Mapping WHERE [DBTable] = @tblName
return @sql
END
進んでください。