当我“内联”变量时,下面语句中的 @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 语句动态定位任何数据库。