SQL 服务器:Concat 中途停止
SQL Server: Concat stopping partway through
我正在为经常重复的标量函数构建一些动态 SQL 生成器,我 运行 遇到了 CONCAT
的问题:即它在操作中途停止,并且 returns 是一个不完整(截断的)字符串值。
(我试过使用 + 运算符和 CONCAT
函数调用,两种方式的结果相同。)
我在底线上添加了注释,准确显示了截断 return 值的位置。
这是数据类型差异吗?
我尝试手动将一些字符串转换为 NVARCHAR ( 4000 )
,但没有任何改变。
我也尝试使用 NVARCHAR ( MAX )
,但同样对结果没有影响。
在此示例中,@FunctionName
和 @DescriptivePKColumnName
都是 NVARCHAR ( 48 )
并且不为 null 或空。
DECLARE @SQL NVARCHAR ( 4000 ) =
IIF ( EXISTS ( SELECT 1 /* CREATE vs ALTER, does the function already exist? */
FROM [sys].[objects]
WHERE [object_id] = OBJECT_ID ( N'[dbo].[' + @FunctionName + N']' ) ) ,
N'ALTER' , N'CREATE' ) + N' FUNCTION [dbo].[' + @FunctionName + N'] /* so far so good */
(
@' + @DescriptivePKColumnName + N'Param TINYINT NOT NULL /* final + gets hung up */
)
RETURNS NVARCHAR ( 48 )
WITH NATIVE_COMPILATION ,
SCHEMABINDING
AS BEGIN ATOMIC WITH ( TRANSACTION ISOLATION LEVEL = SNAPSHOT ,
LANGUAGE = N''English'' )
RETURN' ; /* Concat ends prematurely with '= N''Engli' */
下面是即时截图window:
试试这个:
DECLARE @SQL NVARCHAR(4000)
DECLARE @FunctionName NVARCHAR(255) = 'dbo.test'
DECLARE @DescriptivePKColumnName NVARCHAR(255) = 'Column1'
IF EXISTS
(
SELECT 1
FROM [sys].[objects]
WHERE [object_id] = OBJECT_ID(@FunctionName)
)
BEGIN
set @SQL = 'ALTER'
END
ELSE
BEGIN
set @SQL = 'CREATE'
END
SET @SQL += ' FUNCTION ' + @FunctionName + '(@' + @DescriptivePKColumnName +'Param TINYINT)
RETURNS NVARCHAR(48)
WITH NATIVE_COMPILATION , SCHEMABINDING
AS
BEGIN ATOMIC WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT,LANGUAGE = N''English'' )
RETURN
END'
这是 SSMS 中调试 windows 的限制(即时、监视等)
调试 windows 似乎有字符限制,它们会截断较长的字符串。
如果您 PRINT @SQL
您应该看到整个连接的字符串。
我正在为经常重复的标量函数构建一些动态 SQL 生成器,我 运行 遇到了 CONCAT
的问题:即它在操作中途停止,并且 returns 是一个不完整(截断的)字符串值。
(我试过使用 + 运算符和 CONCAT
函数调用,两种方式的结果相同。)
我在底线上添加了注释,准确显示了截断 return 值的位置。
这是数据类型差异吗?
我尝试手动将一些字符串转换为 NVARCHAR ( 4000 )
,但没有任何改变。
我也尝试使用 NVARCHAR ( MAX )
,但同样对结果没有影响。
在此示例中,@FunctionName
和 @DescriptivePKColumnName
都是 NVARCHAR ( 48 )
并且不为 null 或空。
DECLARE @SQL NVARCHAR ( 4000 ) =
IIF ( EXISTS ( SELECT 1 /* CREATE vs ALTER, does the function already exist? */
FROM [sys].[objects]
WHERE [object_id] = OBJECT_ID ( N'[dbo].[' + @FunctionName + N']' ) ) ,
N'ALTER' , N'CREATE' ) + N' FUNCTION [dbo].[' + @FunctionName + N'] /* so far so good */
(
@' + @DescriptivePKColumnName + N'Param TINYINT NOT NULL /* final + gets hung up */
)
RETURNS NVARCHAR ( 48 )
WITH NATIVE_COMPILATION ,
SCHEMABINDING
AS BEGIN ATOMIC WITH ( TRANSACTION ISOLATION LEVEL = SNAPSHOT ,
LANGUAGE = N''English'' )
RETURN' ; /* Concat ends prematurely with '= N''Engli' */
下面是即时截图window:
试试这个:
DECLARE @SQL NVARCHAR(4000)
DECLARE @FunctionName NVARCHAR(255) = 'dbo.test'
DECLARE @DescriptivePKColumnName NVARCHAR(255) = 'Column1'
IF EXISTS
(
SELECT 1
FROM [sys].[objects]
WHERE [object_id] = OBJECT_ID(@FunctionName)
)
BEGIN
set @SQL = 'ALTER'
END
ELSE
BEGIN
set @SQL = 'CREATE'
END
SET @SQL += ' FUNCTION ' + @FunctionName + '(@' + @DescriptivePKColumnName +'Param TINYINT)
RETURNS NVARCHAR(48)
WITH NATIVE_COMPILATION , SCHEMABINDING
AS
BEGIN ATOMIC WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT,LANGUAGE = N''English'' )
RETURN
END'
这是 SSMS 中调试 windows 的限制(即时、监视等)
调试 windows 似乎有字符限制,它们会截断较长的字符串。
如果您 PRINT @SQL
您应该看到整个连接的字符串。