Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用动态sql查询方法读取xml节点值;执行sp_executesql"; 在这里声明XML_Sql_Sql Server_Xml - Fatal编程技术网

如何使用动态sql查询方法读取xml节点值;执行sp_executesql"; 在这里声明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

将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 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