2016-06-25 1 views
-1

J'obtiens une erreurSQL: création dynamique à SQL erreur scalaire sur le noeud XML

doit déclarer la variable scalaire "@model_look_xml"

lors de la création d'une requête dynamique.

Cette exécute bien:

SELECT * 
FROM model 
WHERE (model_height BETWEEN 0.00 AND 80.00 
    AND model_id IN (SELECT DISTINCT assn.assn_model_id 
        FROM model_look 
        INNER JOIN model_skill ON model_look.model_look_model_id = 
model_skill.model_skill_model_id 
        INNER JOIN assn ON assn.assn_model_id = model_skill.model_skill_model_id 
        WHERE assn.assn_office = 34 
        AND model_skill_skill_id = 12 
        AND EXISTS (SELECT 1 
           FROM @model_look_xml.nodes('/root/id') AS result(node) 
           WHERE node.value('(.)[1]', 'int') = model_look_look_id)) 

Lorsque je tente de le casser dynamique, je ne sais pas comment gérer les nœuds.

Cela fonctionne très bien:

declare @model_look_xml xml 
declare @model_skill_xml xml 
declare @model_eyes_xml xml 
declare @model_hair_xml xml 
declare @model_ethnicity_xml xml 
declare @model_skill_skill_id int 
declare @assn_office int 
declare @top_height decimal(4,2) 
declare @low_height decimal(4,2) 
declare @SQL NVARCHAR(MAX) 
--testing values 
set @assn_office = 34 
set @top_height = 80.00 
set @low_height = 0.00 
set @model_look_xml = CAST('<root><id>7</id><id>6</id><id>12</id></root>' AS XML) 

SET @SQL = N'SELECT * FROM model where ' 
SET @SQL = @SQL + N'(model_height between ' 
SET @SQL = @SQL + cast(@low_height as varchar(50)) 
SET @SQL = @SQL + ' and ' 
SET @SQL = @SQL + cast(@top_height as varchar(50)) 
SET @SQL = @SQL + N' and model_id in (Select distinct assn.assn_model_id From ' 
SET @SQL = @SQL + N'model_look Inner Join 
    model_skill On model_look.model_look_model_id = 
    model_skill.model_skill_model_id Inner Join 
    assn On assn.assn_model_id = model_skill.model_skill_model_id 
    Where assn.assn_office = '+ cast(@assn_office as varchar(50)) +' 
    and model_skill_skill_id = '+ cast(@model_skill_skill_id as varchar(50)) --+'))' 
SET @SQL = @SQL + N' and exists(select 1 from ' 

Jusqu'à ce que je reçois à cette ligne, pas sûr comment le gérer. Si je ne vais le faire une fois que je l'aurais trouvé une autre façon, mais je vais avoir 6 paramètres optionnels (listes possibles) feront leur apparition.

SET @SQL = @SQL + N'@model_look_xml.nodes(''/root/id'')as result(node) where node.value(''(.)[1]'', ''int'') = model_look_look_id))' 
+0

@model_look_xml n'est déclaré à aucun moment. Pour cette question, il n'est pas déclaré dans le premier exemple, ce qui ne peut pas travailler non plus! –

Répondre

0

Vous ne nous montrer où @model_look_xm est effectivement déclarée . Je suppose que c'est parce que vous dites que cela fonctionne. Toutefois, le problème le plus probable est que votre variable locale n'est pas accessible dans votre instruction SQL dynamique. Vous devez le passer en paramètre si vous commandez pour y accéder.

Pour résoudre simplement définir @model_look_xm comme un paramètre d'entrée sur votre déclaration dynamique.

EXECUTE sp_executeql @SQL, N'@model_look_xm XML', @model_look_xm = @model_look_xm 

Cette ligne est un peu une supposition parce que vous ne montrez pas tout votre code, ajustez si nécessaire.

+0

Merci Matt, ça l'a corrigé! – Skip