当我“内联”变量时,下面语句中的 @SQL 变量总是被截断。如果我发送变量并打印,它不会截断到 4000,但是,我无法将发送的变量绑定到 USE [@DatabaseName] 语句中。如何解决。
这是可行的,但是数据库名称在 USE 语句中是硬编码的
DECLARE @DatabaseName NVARCHAR(MAX) = 'MyDatabase'
DECLARE @Sql NVARCHAR(MAX)=
'
USE [MyDatabase]
PRINT @DatabaseName
SELECT
...<20,000 more chars
'
DECLARE @params NVARCHAR(MAX) ='@DatabaseName NVARCHAR(MAX)'
EXEC sp_executesql @SQL, @params,@DatabaseName
这将引发异常,并显示消息“数据库‘@DatabaseName’不存在。请确保正确输入名称。”
DECLARE @DatabaseName NVARCHAR(MAX) = 'MyDatabase'
DECLARE @Sql NVARCHAR(MAX)=
'
USE [@DatabaseName]
PRINT @DatabaseName
SELECT
...<20,000 more chars
'
DECLARE @params NVARCHAR(MAX) ='@DatabaseName NVARCHAR(MAX)'
EXEC sp_executesql @SQL, @params,@DatabaseName
这会将查询截断为 NVARCHAR(4000)
DECLARE @DatabaseName NVARCHAR(MAX) = 'MyDatabase'
DECLARE @Sql NVARCHAR(MAX)=
'
USE ['+@DatabaseName+']
PRINT @DatabaseName
SELECT
...<20,000 more chars
'
DECLARE @params NVARCHAR(MAX) ='@DatabaseName NVARCHAR(MAX)'
EXEC sp_executesql @SQL, @params,@DatabaseName
也尝试使用 N'string',但没有成功
DECLARE @DatabaseName NVARCHAR(MAX) = N'MyDatabase'
DECLARE @Sql NVARCHAR(MAX)=
N'
USE ['+@DatabaseName+']
PRINT @DatabaseName
SELECT
...<20,000 more chars
'
DECLARE @params NVARCHAR(MAX) =N'@DatabaseName NVARCHAR(MAX)'
EXEC sp_executesql @SQL, @params,@DatabaseName
我想我明白为什么USE [@Variable]
不起作用,而我不知道如何解释为什么USE ['+@Variable+']
当两个变量都最大时会被截断到 4000,除非 sql server 正在强制关闭sp_executesql
。
无论如何,有谁知道有什么解决方法可以实现这一点。我基本上想使用大于 4000 个 nchars 的 SQL 语句动态定位任何数据库。
每个字符串都应该带有
N' '
,例如, +N'] PRINT @DatabaseName...'
字符串从左到右连接,只有
max
当其中一个字符串为 时,连接才会提升为max
。如上所述,所有字符串都应以 为前缀,N
以使它们成为,否则它们可以通过firstnvarchar
进行转换。varchar(8000)
对于如此大的批次,您最好连接一个
max
值。最简单的方法是分配N''
给@Sql
,然后使用+=
。请注意,
USE
您可以动态选择sp_executesql
,例如EXEC @procName
。