使用 SQL Server 2012,我发现尝试基于表中的 nvarchar(max) 列构建字符串似乎无法正常工作。它似乎是覆盖,而不是追加。任意示例:
DECLARE @sql nvarchar(max);
SELECT @sql = N'';
SELECT @sql += [definition] + N'
GO
'
FROM sys.sql_modules
WHERE OBJECT_NAME(object_id) LIKE 'dt%'
ORDER BY OBJECT_NAME(object_id);
PRINT @sql;
这应该打印出数据库中所有各种 dt_ 表的所有 SQL 模块定义,并用 GO 分隔,作为随后可以运行的脚本。但是...这仅打印出最后一个模块定义,而不是所有模块定义的总和。它的行为就好像“+=”只是一个“=”。
如果你稍微改变它......例如将 [definition] 转换为 nvarchar(4000),它会突然按预期工作。此外,如果您选择不是 nvarchar(max) 或 varchar(max) 类型的任何其他列,它也会按预期工作。例子:
DECLARE @sql nvarchar(max);
SELECT @sql = N'';
SELECT @sql += CAST([definition] AS nvarchar(4000)) + '
GO
'
FROM sys.sql_modules
WHERE OBJECT_NAME(object_id) LIKE 'dt%'
ORDER BY OBJECT_NAME(object_id);
PRINT @sql;
这是一个已知的错误?或者这是否按预期工作?难道我做错了什么?有什么方法可以让我正确地进行这项工作吗?我尝试了十几种不同的方法,包括确保串联中的每个表达式都是相同的 nvarchar(max) 类型,包括字符串文字。
注意:该示例只是一个显示问题的示例,并不完全是我在现实生活中尝试做的事情。如果您的数据库没有定义“dt*”表,您可以更改 WHERE 子句以指定您想要的任何数据库中的任何一组表或存储过程,您将得到相同的结果...只有最后一个显示在 @sql 字符串中,就好像您只是执行了“=”而不是“+=”。另外,明确声明“@sql = @sql + ”的行为方式相同...除了 nvarchar(max) 或 varchar(max) 之外,每个字符串类型都可以正常工作。
我已经验证没有一个 [定义] 值也为 NULL,因此没有发生 NULL 恶作剧。
+= 运算符仅适用于 SQL Server 中的数字数据类型。微软文档在这里 https://learn.microsoft.com/en-us/sql/t-sql/language-elements/add-equals-transact-sql?view=sql-server-2017
对于字符串连接,需要分别编写赋值和连接。
DECLARE @sql nvarchar(max);
SELECT @sql = N'';
SELECT @sql = @sql + [definition] + N'
GO
'
FROM sys.sql_modules
WHERE OBJECT_NAME(object_id) LIKE 'dt%'
ORDER BY OBJECT_NAME(object_id);
PRINT @sql;
另外,如果您在 Management Studio 中运行此查询,请记住它将返回的数据(包括打印语句中的数据)的大小是有限制的。因此,如果模块的定义超出此限制,它们将在输出中被截断。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)