2009-08-25 5 views
1

Au cours d'une épreuve hier, j'ai appris que vous ne pouvez pas passer cette requête à exec():Pourquoi SQL Server nécessite que l'INT soit converti en NVARCHAR?

@SQL = @SQL + 'WHERE ID = ' + @SomeID 
EXCEC(@SQL) 

Où @SomeID est un INT et @SQL est NVARCHAR. Cela se plaindra de ne pas pouvoir convertir NVARCHAR en INT lors de l'exécution.

Je l'ai réalisé que vous devez faire comme

@SQL = @SQL + 'WHERE ID = ' + CONVERT(NVARCHAR(20), @SomeID) 

Ce que je ne comprenais pas pourquoi? Pourquoi SQL Server ne comprend pas l'INT lorsqu'il est simplement +: sur un NVARCHAR? Je suppose que cela a quelque chose à voir avec les jeux de caractères.

EDIT: Correction de fautes de frappe (quelques +: s manquées).

Répondre

2

+ (Concaténation)

un opérateur dans une expression de chaîne qui concatène deux ou plusieurs caractères ou des chaînes binaires, des colonnes, ou une combinaison de chaînes de caractères et de la colonne noms dans une expression (un opérateur chaîne ).

expression est une expression valide Microsoft® SQL Server ™ de l'un des types de données dans le caractère et la catégorie de type de données binaires, sauf l'image, ntext ou types de données texte. Les deux expressions doivent être du même type de données, ou une expression doit pouvoir être convertie implicitement en le type de données de l'autre expression.

Alors ... Il n'y a pas convertion implicite de int à la chaîne ... Ceci est une question interne

+0

La question suivante serait bien sûr pourquoi il n'y a pas de conversion implicite de int en string, mais je suppose que je vais devoir vivre avec. –

+1

Je suppose que ce n'est pas autorisé car il est trop sujet à l'erreur (il y a une chance de perdre des données (si le champ nvarchar est trop court), de la même façon que vous ne pouvez pas convertir en C# –

+1

Mais la conversion implicite d'un INT en NVARCHAR est autorisée, de même que la conversion implicite de NVARCHAR en INT (voir le tableau sur: http://msdn.microsoft.com/en-us/library/aa226054(SQL.80).aspx). , en voyant un opérateur + avec un nombre sur un et un char/nchar/varchar/nvarchar de l'autre côté, SQL Server tente la conversion implicite en le type numérique et puis effectue un ajout au lieu de convertir le numérique en une chaîne et concaténant Il est ambigus ce qui est recherché MS (et probablement Sybase avant eux) a choisi une manière Si vous voulez l'autre, vous devez utiliser la conversion explicite –

1

Je ne dis pas que ce sera certainement le travail, et je ne suis pas près de mon studio de gestion de SQL pour l'essayer avant de poster, mais vous avez essayé quelque chose comme ceci:

@SQL = @SQL + 'Where ID = ' + @SomeID 
EXEC(@SQL) 
+0

Ach! C'est une faute de frappe. Ma faute. + un pour repérer, et corriger sans se moquer de moi. ;) –

Questions connexes