2010-04-29 10 views
2

Je suis nouveau à T-SQL et je voulais savoir pourquoi les travaux suivants et ne soulève pas et erreur:Pourquoi Régler commande est vide

je:

DECLARE @aVARCHAR(200), @b VARCHAR(100) 
SET @a = (Some complicated SELECT Statement) 
SET @b = 'ALTER TABLE abc DROP CONSTRAINT ' + @a; <-------- expected it to contain string. 
Exec(@b); 

Le premier jeu a une instruction select complexe qui ne renvoie AUCUNE ligne.

Je m'attendais alors à ce que @b ait la chaîne 'ALTER TABLE abc DROP CONSTRAINT' MAIS qu'elle soit vide lors du débogage. C'est ce que j'ai trouvé confus. Pourquoi cela arrive-t-il?

J'utilise SQL Server Express 2008.

Répondre

2

chaque fois que vous concaténer des chaînes que vous devez protéger contre nulls, car chaque fois que vous concaténer une chaîne avec null, la chaîne résultante est nulle:

DECLARE @NullValue varchar(5) 
SET @NullValue=null --not necessary but to make the point 
SELECT 'Hello World'[email protected] 

sortie:

------------ 
NULL 

(1 row(s) affected) 

protection contre nulls:

DECLARE @NullValue varchar(5) 
SET @NullValue=null --not necessary but to make the point 
SELECT 'Hello World'+ISNULL(@NullValue,'') 

sortie:

------------ 
Hello World 

(1 row(s) affected) 

un autre exemple:

SELECT 'Hello World'[email protected] 

ce qui sera affiché? Qui sait, si @YourValueHere est NULL, alors rien. utilisez ceci à la place pour vous assurer que vous obtenez ce que vous recherchez:

SELECT 'Hello World'+ISNULL(@YourValueHere,'') 
+0

Merci pour les exemples. C'est la première fois que j'ai utilisé T-SQL et cela aide beaucoup. –

4

Si @a est nul, alors quoi que ce soit concaténé il sera également nulle. Faites quelque chose comme

isnull(@a,'') + 'rest of the string'

2

Il y a quelques problèmes:

1) @a sort comme nulle, de sorte que l'affectation de @b ne fonctionne pas comme prévu. Faites une vérification de validation sur @a avant d'essayer de l'utiliser et d'exécuter @b. Pour ce qui est de savoir pourquoi il est vide, assurez-vous que votre requête complexe est correcte. 2) @b doit être plus grand que @a pour s'assurer qu'il peut contenir la commande ALTER TABLE plus tout ce qui va dans @a. Actuellement, vous avez @b à la moitié de la taille de @a.

Questions connexes