Pourquoi nous ne devrions pas utiliser varchar dans "sp_executesql"?

Chaque fois que j'essaie d'utiliser varchar dans sp_executesql , l'erreur suivante se produit toujours:

La procédure attend le paramètre '@statement' de type 'ntext / nchar / nvarchar'

Y a-t-il une raison pour laquelle nous devrions utiliser nvarchar ?

Si "exec" nous permet d'utiliser varchar, pourquoi pas sp_executesql?

Exemple de code:

 DECLARE @IntVariable int; DECLARE @SQLSsortingng **varchar**(500);--**we need to use nvarchar!! but why?** DECLARE @ParmDefinition nvarchar(500); SET @SQLSsortingng = 'SELECT nationalidnumber, NationalIDNumber, Title, LoginID FROM AdventureWorks.HumanResources.Employee WHERE nationalidnumber = @BusinessEntityID'; SET @ParmDefinition = '@BusinessEntityID int'; SET @IntVariable = 14417807; EXECUTE sp_executesql @SQLSsortingng, @ParmDefinition, @BusinessEntityID = @IntVariable; SET @IntVariable = 109; EXECUTE sp_executesql @SQLSsortingng, @ParmDefinition, @BusinessEntityID = @IntVariable; 

Msdn0

EXÉCUTER

Exécute une string de command ou une string de caractères dans un lot Transact-SQL

@ssortingng_variable

Est le nom d'une variable locale. @ssortingng_variable peut être n'importe quel type de données char , varchar , nchar ou nvarchar . Ceux-ci incluent datatables (max)

les types. [N] 'tsql_ssortingng'

Est une string constante. tsql_ssortingng peut être n'importe quel type de données nvarchar ou varchar . Si le N est inclus, la string est interprétée comme un type de données nvarchar.

Msdn1

sp_executesql

[@stmt =] instruction

Chaîne Unicode contenant une instruction Transact-SQL ou un lot

Donc, il a besoin de variables dans Unicode par design (comme dit @marc_s). Et comme l'a commenté @MattGibson, l'utilisation d'Unicode est une pratique moderne.

Msdn2

nvarchar [(n | max)]

Données de string Unicode de longueur variable.

Msdn3

varchar [(n | max)]

Données de string de longueur variable, non-Unicode .

Et ici, vous pouvez en savoir plus sur la différence entre varchar et nvarchar : Quelle est la différence entre varchar et nvarchar?