我正在为频繁重复的标量函数构建一些动态SQL生成器,而我遇到了CONCAT
的问题:即,它在操作过程中停止,并返回了不完整的(截断的)字符串值
(我尝试使用+运算符和CONCAT
函数调用,两种方法的结果相同。)
我在底行添加了一条注释,准确显示了截断返回值的位置。
这是数据类型差异吗?
我尝试将一些字符串手动强制转换为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' */
答案 0 :(得分:1)
尝试一下:
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'
答案 1 :(得分:0)
这是SSMS中调试窗口的限制(即时,监视等)。
调试窗口似乎有一个字符限制,并且它们会截断更长的字符串。
如果您PRINT @SQL
,应该会看到整个串联的字符串。