SQL:创建动态 SQL 在 XML 节点上出现标量错误
SQL: creating Dynamic SQL getting scalar error on XML node
我收到一个错误
Must declare the scalar variable "@model_look_xml"
创建动态查询时。
这执行得很好:
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))
当我尝试动态分解它时,我不确定如何处理节点。
这很好用:
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 '
直到我到达这一行,我不确定如何处理它。如果我只打算这样做一次,我会找到不同的方法,但我将有 6 个可选参数(可能的列表)进来。
SET @SQL = @SQL + N'@model_look_xml.nodes(''/root/id'')as result(node) where node.value(''(.)[1]'', ''int'') = model_look_look_id))'
你从来没有告诉我们 @model_look_xm
实际声明的地方。我认为这一定是因为你说它确实有效。但是,最可能的问题是您的局部变量无法在动态 sql 语句中访问。如果要访问它,您必须将它作为参数传递。
要解决这个问题,只需将 @model_look_xm
定义为动态语句的输入参数即可。
EXECUTE sp_executeql @SQL, N'@model_look_xm XML', @model_look_xm = @model_look_xm
这一行有点假设,因为您没有显示所有代码,因此请根据需要进行调整。
我收到一个错误
Must declare the scalar variable "@model_look_xml"
创建动态查询时。
这执行得很好:
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))
当我尝试动态分解它时,我不确定如何处理节点。
这很好用:
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 '
直到我到达这一行,我不确定如何处理它。如果我只打算这样做一次,我会找到不同的方法,但我将有 6 个可选参数(可能的列表)进来。
SET @SQL = @SQL + N'@model_look_xml.nodes(''/root/id'')as result(node) where node.value(''(.)[1]'', ''int'') = model_look_look_id))'
你从来没有告诉我们 @model_look_xm
实际声明的地方。我认为这一定是因为你说它确实有效。但是,最可能的问题是您的局部变量无法在动态 sql 语句中访问。如果要访问它,您必须将它作为参数传递。
要解决这个问题,只需将 @model_look_xm
定义为动态语句的输入参数即可。
EXECUTE sp_executeql @SQL, N'@model_look_xm XML', @model_look_xm = @model_look_xm
这一行有点假设,因为您没有显示所有代码,因此请根据需要进行调整。