Pourquoi est-ce que j'obtiens «La procédure attend le paramètre '@statement' de type 'ntext / nchar / nvarchar'.» quand j'essaye d'utiliser sp_executesql?

96

Pourquoi ai-je cette erreur

Procedure expects parameter '@statement' of type 'ntext/nchar/nvarchar'.

quand j'essaye d'utiliser sp_executesql?

Manoj Wadhwani
la source
1
Comment essayez-vous de l'exécuter? Dans T-SQL? D'un programme? Passez-vous le paramètre obligatoire "@statement"?
Matt Hamilton

Réponses:

216

On dirait que vous appelez sp_executesql avec une instruction VARCHAR, alors qu'il doit s'agir de NVARCHAR.

Par exemple, cela donnera l'erreur car @SQL doit être NVARCHAR

DECLARE @SQL VARCHAR(100)
SET @SQL = 'SELECT TOP 1 * FROM sys.tables'
EXECUTE sp_executesql @SQL

Alors:

DECLARE @SQL NVARCHAR(100)
SET @SQL = 'SELECT TOP 1 * FROM sys.tables'
EXECUTE sp_executesql @SQL
AdaTheDev
la source
Cela fonctionne, mais l'autre réponse (de Daniel Renshaw) est BEAUCOUP plus utile, la plupart du temps. (puisqu'il n'a pas besoin de la déclaration de variable inutile)
Brondahl
22

La solution consiste à placer un N devant à la fois le type et la chaîne SQL pour indiquer qu'il s'agit d'une chaîne de caractères codés sur deux octets:

DECLARE @SQL NVARCHAR(100) 
SET @SQL = N'SELECT TOP 1 * FROM sys.tables' 
EXECUTE sp_executesql @SQL
Daniel Renshaw
la source
0

J'avais manqué un autre petit détail: j'ai oublié les crochets "(100)" derrière NVARCHAR.

Simaglei
la source