2014-11-27 5 views
0

У меня есть XML, как показано нижеXML Синтаксический в хранимой процедуре

<StudentData> 
    <Student ID ="1" RollNo ="15" /> 
</StudentData> 

Один из моей хранимой процедуры принимает этот XML в качестве входных данных, как показано ниже

CREATE PROCEDURE [dbo].[FetchStudentData] 
@xml XML  
AS 
BEGIN 
     SET NOCOUNT ON;  

     SELECT 
     st.value('@ID','INT') AS Id, 
     st.value('@RollNo','INT') AS RollNo 
     @xml.nodes('/StudentData/Student')AS TEMPTABLE(st) 

END 

Здесь я хочу, чтобы сохранить Id и RollNo в некоторой переменной, чтобы я мог использовать их в дальнейших запросах с помощью хранимой процедуры. Я не знаю точного синтаксиса для извлечения Id и RollNo из узла и хранения в переменной.

Может ли кто-нибудь предложить мне способ сделать это?

+0

http://www.mssqltips.com/sqlservertip/2899/importing-and-processing-data-from-xml-files-into-sql-server-tables/ – CodingDefined

ответ

1

Этот запрос будет полезен.

CREATE PROCEDURE [dbo].[FetchStudentData] 
@xml XML  
AS 
BEGIN 
     SET NOCOUNT ON;  

     DECLARE @sID AS INT, @sRollNo AS INT 

     SELECT @sID = xmlData.Student.value('@ID','INT'), 
      @sRollNo = xmlData.Student.value('@RollNo','INT') 
    FROM @xml.nodes('//StudentData/Student') xmlData(Student) 

    SELECT @sID AS ID, @sRollNo AS RollNo 
END 

Oupput:

enter image description here

Nore: Для нескольких студентов тегов

CREATE PROCEDURE [dbo].[Test1] 
    @xml XML  
    AS 
    BEGIN 
      SET NOCOUNT ON;  

      DECLARE @StudentTbl as TABLE 
      (
      ID int, 
      RollNo int 
     ) 

     INSERT INTO @StudentTbl 
     SELECT xmlData.Student.value('@ID','INT'), 
       xmlData.Student.value('@RollNo','INT') 
     FROM @xml.nodes('//StudentData/Student') xmlData(Student) 

     SELECT * FROM @StudentTbl 
    END 
+0

Я хочу использовать XML в качестве входных данных параметр. Я не хочу устанавливать хранимую процедуру. Какие изменения я могу сделать? – Amit

+0

Я изменил процедуру, используйте это. –

+0

Спасибо, много! Если я хочу сделать дальнейшее улучшение, добавив несколько тегов студентов, то что я могу сделать для циклирования? – Amit

0

Вы можете назначить их переменным, используя функцию значения для типа XML и nvaigate к атрибуту непосредственно в xpath ...

DECLARE @xml AS XML 

SET @xml = '<StudentData> 
       <Student ID ="1" RollNo ="15" /> 
      </StudentData>' 

DECLARE @rollNo int , @ID int 

SET @rollNo = @xml.value('/StudentData[1]/Student[1]/@RollNo','int') 
SET @ID = @xml.value('/StudentData[1]/Student[1]/@ID','int') 

SELECT @rollNo ,@ID 
0

Вот еще один пример помещения их в переменные.

Declare @ID int 
    DECLARE @RollNo int 

    SELECT 
    @ID = st.value('@ID','INT'), 
    @RollNo = st.value('@RollNo','INT') 
    From 
    @xml.nodes('/StudentData/Student')AS TEMPTABLE(st) 

SELECT @ID AS ID, @RollNo AS RollNo 
Смежные вопросы