A variável @SQL na declaração abaixo é sempre truncada quando eu "inline" uma variável. Se eu enviar a variável e imprimir, ela não trunca para 4000, no entanto, não consigo vincular a variável enviada em uma declaração USE [@DatabaseName]. Como contornar.
Isso funciona, no entanto, o nome do banco de dados é codificado na instrução 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
Isso gera uma exceção com a mensagem ' O banco de dados '@DatabaseName' não existe. Certifique-se de que o nome foi inserido corretamente .'
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
Isso trunca a consulta para 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
Também tentei usar N'string' sem sucesso
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
Acho que entendo por que isso USE [@Variable]
não funciona, enquanto não sei como explicar por que USE ['+@Variable+']
está sendo truncado para 4000 quando ambas as variáveis estão no máximo, a menos que o SQL Server esteja fazendo a conversão para baixo sp_executesql
.
De qualquer forma, alguém sabe de uma solução alternativa para fazer isso funcionar? Eu basicamente quero direcionar dinamicamente qualquer banco de dados com uma instrução sql maior que 4000 nchars.
Cada string deve estar com
N' '
, por exemplo, +N'] PRINT @DatabaseName...'
As strings são concatenadas da esquerda para a direita, e a concatenação só é promovida para
max
quando uma das strings émax
. Conforme mencionado, todas as strings devem ser prefixadas comN
para torná-lasnvarchar
, caso contrário, elas podem ser transformadas viavarchar(8000)
first.Com um lote tão grande, é melhor concatenar um
max
valor. A maneira mais fácil de fazer isso é atribuirN''
a@Sql
, então usar+=
.Observe que em vez de
USE
você pode escolher dinamicamentesp_executesql
, comoEXEC @procName
.