如何使用动态sql查询方法读取xml节点值;执行sp_executesql"; 在这里声明XML
将proc@input参数声明为XML,与实际传递的类型相同如何使用动态sql查询方法读取xml节点值;执行sp_executesql"; 在这里声明XML,sql,sql-server,xml,Sql,Sql Server,Xml,将proc@input参数声明为XML,与实际传递的类型相同 DECLARE @input XML SET @input = '<AcordXML > <location id="1"><id>1</id> <name>first</name><noofemp>37</noofemp> </location></AcordXML>' DECLARE @Equery nvar
DECLARE @input XML
SET @input = '<AcordXML > <location id="1"><id>1</id> <name>first</name><noofemp>37</noofemp> </location></AcordXML>'
DECLARE @Equery nvarchar(max)
SET @Equery = 'SELECT C.value(''name[1]'',''varchar(MAX)''), C.value(''noofemp[1]'', ''varchar(MAX)'') FROM @input.nodes(''//location'') AS T(C)'
EXECUTE sp_executesql @Equery, N'@input XML',@input=@input
DECLARE@input XML
SET@input='1 first37'
声明@Equery nvarchar(最大值)
将@Equery='从@input.nodes(''//location'')中选择C.value(''名称[1]'',''变量字符(最大值)')、C.value(''noofemp[1]'',''变量字符(最大值)')作为T(C)'
执行sp_executesql@Equery,N'@input XML',@input=@input
这其中的棘手问题是只传递参数,首先您可以看到数据类型为XML的XML参数@Persons的DECLARE,然后您必须声明sql查询本身的语句-确保用单引号包装它,棘手的部分是在执行时,确保按如下方式添加参数:
1-@stmt是要执行的字符串查询
2-在查询中定义参数。
3-将初始化参数中此参数的值指定为@xmlperson=@PersonsXml
就这样,你可以走了
DECLARE @PersonsXml XML = '<persons > <person ><firstName > Jon </firstName ><lastName > Johnson </lastName > </person >
<person > <firstName >Kathy</firstName > <lastName > Carter </lastName > </person >
<person > <firstName > Bob </firstName > <lastName > Burns </lastName > </person > </persons >'
declare @stmt nvarchar(max)
set @stmt = N'Select person.value(''(firstName/text())[1]'',''nvarchar(100)'') as Mobile_Number From @XMLPersons.nodes(''/persons/person'') as Persons(person)'
Execute sp_executesql @stmt, N'@XMLPersons xml' , @XMLPersons = @PersonsXml
DECLARE@PersonsXml='Jon Johnson
凯西·卡特
鲍勃·伯恩斯
声明@stmt nvarchar(最大值)
将@stmt=N'选择person.value(''(firstName/text())[1]'',''nvarchar(100')作为移动电话号码,从@XMLPersons.nodes(''/persons/person'')中选择person(person)'
执行sp_executesql@stmt,N'@xmlpersonxml',@xmlpersonxml=@PersonsXml
您为什么需要这个?也许有更好的方法…@shnugo还有其他方法吗?为什么你需要动态地使用它?虽然这段代码可以解决这个问题,但如何以及为什么解决这个问题会真正有助于提高你的帖子质量,并可能导致更多的投票。请记住,你是在将来回答读者的问题,而不仅仅是现在提问的人。请在回答中添加解释,并说明适用的限制和假设。
DECLARE @input XML
SET @input = '<AcordXML > <location id="1"><id>1</id> <name>first</name><noofemp>37</noofemp> </location></AcordXML>'
DECLARE @Equery nvarchar(max)
SET @Equery = 'SELECT C.value(''name[1]'',''varchar(MAX)''), C.value(''noofemp[1]'', ''varchar(MAX)'') FROM @input.nodes(''//location'') AS T(C)'
EXECUTE sp_executesql @Equery, N'@input XML',@input=@input
DECLARE @PersonsXml XML = '<persons > <person ><firstName > Jon </firstName ><lastName > Johnson </lastName > </person >
<person > <firstName >Kathy</firstName > <lastName > Carter </lastName > </person >
<person > <firstName > Bob </firstName > <lastName > Burns </lastName > </person > </persons >'
declare @stmt nvarchar(max)
set @stmt = N'Select person.value(''(firstName/text())[1]'',''nvarchar(100)'') as Mobile_Number From @XMLPersons.nodes(''/persons/person'') as Persons(person)'
Execute sp_executesql @stmt, N'@XMLPersons xml' , @XMLPersons = @PersonsXml