sql - SQL Server:Concat 中途停止
问题描述
我正在为经常重复的标量函数构建一些动态 SQL 生成器,我遇到了一个问题CONCAT
:即,它在操作的中途停止,并返回一个不完整的(截断的)字符串值。
(我尝试过使用 + 运算符和CONCAT
函数调用,结果都一样。)
我在底线添加了注释,准确显示了它截断返回值的位置。
这是数据类型差异吗?
我尝试手动将一些字符串转换为NVARCHAR ( 4000 )
,但它没有改变任何东西。
我也尝试过使用NVARCHAR ( MAX )
,但同样对结果没有影响。
在此示例中,@FunctionName
and@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' */
解决方案
尝试这个:
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'
推荐阅读
- python - 多重最大标注 matplotlib
- machine-learning - 水流,是否可以解释个别预测?
- javascript - 为什么在nodejs中传播语法抛出错误
- sparql - 使用 wikidata + SPARQL 为给定电影选择一个与给定出版地点匹配的出版日期
- javascript - 是否可以使用 Webpack 将选择性 [.js] 文件包含到特定生成的 [.html] 页面中?
- c# - 在着色器代码中增加纹理的强度 - OpenGL
- tensorflow - SageMaker TensorFlow SavedModel 导出格式是什么?
- ios - Crashlytics 未报告崩溃 - Carthage Swift
- python - 如何使用 tensorflow 检测汽车轮胎的损坏情况?
- elasticsearch - 弹性搜索查询过滤器最高分是多少