How to read an option from XML in T-SQL? - sql-server

I have the next XML file:
<?xml version="1.0" encoding="utf-8"?>
<DynamicEntity Name="ProductsMilk">
<Field Name="Name" Type="nvarchar(256)" AllowNulls="false" />
<Field Name="Description" Type="ntext" AllowNulls="false" />
<Field Name="Price" Type="float" AllowNulls="false" />
</DynamicEntity>
I need to read some value from any option of XML-node, for e.g. I need to read the value of Type option from Field node using T-SQL.
How can I do this using internal OpenXML provider in MSSQL?

The following will extract all the data from your XML:
DECLARE #doc VARCHAR(1000) = '<?xml version="1.0" encoding="utf-8"?>
<DynamicEntity Name="ProductsMilk">
<Field Name="Name" Type="nvarchar(256)" AllowNulls="false" />
<Field Name="Description" Type="ntext" AllowNulls="false" />
<Field Name="Price" Type="float" AllowNulls="false" />
</DynamicEntity>';
DECLARE #iDoc INT;
EXECUTE sp_xml_preparedocument #idoc OUTPUT, #doc;
SELECT *
FROM OPENXML(#iDoc, 'DynamicEntity/Field')
WITH
( DynamicEntityName VARCHAR(100) '../#Name',
FieldName VARCHAR(100) '#Name',
[Type] VARCHAR(100) '#Type',
AllowNulls VARCHAR(100) '#AllowNulls'
);
Basically, you just need to specify a column mapping for your xml attributes.

Here is a solution:
DECLARE #x XML = '<?xml version="1.0" encoding="utf-8"?>
<DynamicEntity Name="ProductsMilk">
<Field Name="Name" Type="nvarchar(256)" AllowNulls="false" />
<Field Name="Description" Type="ntext" AllowNulls="false" />
<Field Name="Price" Type="float" AllowNulls="false" />
</DynamicEntity>'
SELECT t.c.value(N'../#Name', N'nvarchar(100)'),
t.c.value(N'#Name', N'nvarchar(100)'),
t.c.value(N'#Type', N'nvarchar(100)'),
t.c.value(N'#AllowNulls', N'nvarchar(100)')
FROM #x.nodes(N'/DynamicEntity/Field') t(c)

Related

T-SQL how to have multiple criteria in xml.exist function

This code works, but I need to have multiple criteria in the .exist method. "where State = 'FL' And Department = 'HR'" within the same Objects node. I've tried a lot of ways, but no luck. Anyone know how?
Thank you in adance.
If OBJECT_ID(N'tempdb..#xml') Is Not Null
Drop Table #xml
Create Table #Xml
(
RecordId INT IDENTITY(10,1) NOT NULL PRIMARY KEY,
XmlData XML NOT NULL
)
GO
Declare #xml xml =
'<?xml version="1.0" ?>
<DataObject>
<Objects>
<Object Name="FirstName" Value="John" />
<Object Name="LastName" Value="Smith" />
<Object Name="City" Value="Miami" />
<Object Name="State" Value="FL" />
<Object Name="Department" Value="HR" />
</Objects>
</DataObject>'
Insert #xml select #xml
Set #xml =
'<?xml version="1.0" ?>
<DataObject>
<Objects>
<Object Name="FirstName" Value="Jane" />
<Object Name="LastName" Value="Doe" />
<Object Name="City" Value="Hollywood" />
<Object Name="State" Value="FL" />
<Object Name="Department" Value="Accounting" />
</Objects>
</DataObject>'
Insert #xml select #xml
Declare #Dept varchar(30) = 'HR', #State varchar(30) = 'FL'
Select RecordID
From #Xml
Where XMLData.exist('//Objects[Object[#Name="State"][#Value=sql:variable("#State")]]') = 1
Please try the following. The XPath expression is checking exactly for what you need.
SQL
-- DDL and sample data population, start
DECLARE #tbl TABLE
(
RecordId INT IDENTITY(10,1) PRIMARY KEY,
XmlData XML NOT NULL
);
INSERT INTO #tbl (XmlData)
VALUES (N'<?xml version="1.0" ?>
<DataObject>
<Objects>
<Object Name="FirstName" Value="John" />
<Object Name="LastName" Value="Smith" />
<Object Name="City" Value="Miami" />
<Object Name="State" Value="FL" />
<Object Name="Department" Value="HR" />
</Objects>
</DataObject>')
, (N'<?xml version="1.0" ?>
<DataObject>
<Objects>
<Object Name="FirstName" Value="Jane" />
<Object Name="LastName" Value="Doe" />
<Object Name="City" Value="Hollywood" />
<Object Name="State" Value="FL" />
<Object Name="Department" Value="Accounting" />
</Objects>
</DataObject>');
-- DDL and sample data population, end
DECLARE #Dept VARCHAR(30) = 'HR', #State CHAR(2) = 'FL';
SELECT RecordID
FROM #tbl
WHERE XMLData.exist('/DataObject/Objects[Object[#Name="State" and #Value=sql:variable("#State")]
and Object[#Name="Department" and #Value=sql:variable("#Dept")]]') = 1;
Output
+----------+
| RecordID |
+----------+
| 10 |
+----------+

Update SQL table from XML

I have two different XML files, from which I have to update two SQL tables via a stored procedure. one is in the format <InvoiceNumber>17-I-36528</InvoiceNumber>, and works fine.
The second file is in the format
<field name="ABCD" type="String" identifier="d167bea7-2ec6-498e-9a8a-3d0e6f37b6b3" value="EFGF" /> this file does not update the table.
What am I doing wrong here? Thanks in advance.
not working XML file
<?xml version="1.0" encoding="utf-8"?>
<document name="COM1-0000000011" type="Commercial_Doc" identifier="02fa318a-bd80-4f73-97bb-141884fbcff5" description="" client="Level 4" process="LEVEL 4 - Commercial" deleted="False">
<field name="Email_From" type="String" identifier="d167bea7-2ec6-498e-9a8a-3d0e6f37b6b3" value="aa#abcd.com" />
<field name="Email_To" type="String" identifier="9f9ad742-502b-44e4-b223-ae048b395bd3" value="bb#abcd.com" />
<field name="Email_Subject" type="String" identifier="cb7c7194-bc4c-4e44-b9b6-7643f1faca13" value="Second set" />
<field name="Email_EmailDate" type="DateTime" identifier="7476b62b-ec35-432b-8d50-572ed504133e" value="03/18/2015 04:05:09" />
<field name="Email_LocalDate" type="DateTime" identifier="ce571c82-440a-4ffd-8ee9-ebf53c1e9071" value="03/18/2015 09:35:09" />
<field name="Email_ReceivedDate" type="String" identifier="f007da05-2ffa-4290-9f28-6cd15de3c5b1" value="03/18/2015 09:35:10" />
<field name="Email_Charset" type="String" identifier="237a7237-b57a-404c-9fdb-39eca5a0d197" value="us-ascii" />
<field name="Email_PreferredCharset" type="String" identifier="f577b3b5-46a2-45ea-8db5-f1b8dc478d2b" value="" />
<field name="OutputImageFile" type="String" identifier="bec3db3f-21c0-4491-99e2-ea32e0f2b788" value="E:\Level 4\ComDoc\Output\02fa318a-bd80-4f73-97bb-141884fbcff5.PDF" />
<table name="itemdata" />
</document>
Stored procedure
CREATE PROCEDURE [dbo].[prc_Commercial_Invoice_XML]
(
#XMLdata XML
)
AS
BEGIN
INSERT INTO [DocumentDetails]
([Name]
,[Type]
,[Identifier]
,[Value]
,[ItemType])
SELECT
[Name] = TempTable.t.value('Email_From[1]','nvarchar(120)')
,[Type] = TempTable.t.value('Email_To[1]','nvarchar(120)')
,[Identifier] = TempTable.t.value('Email_Subject[1]','nvarchar(120)')
,[Value] = TempTable.t.value('Email_ReceivedDate[1]','nvarchar(120)')
,[ItemType] = TempTable.t.value('Email_Charset[1]','nvarchar(120)')
FROM
#XMLdata.nodes('/')AS TempTable(t)
END
Create Table
CREATE TABLE [dbo].[DocumentDetails](
[Id] [int] IDENTITY(1,1) NOT NULL,
[ItemType] [varchar](120) NULL,
[Name] [varchar](120) NULL,
[Type] [varchar](120) NULL,
[Identifier] [varchar](120) NULL,
[Value] [varchar](120) NULL,
CONSTRAINT [PK_DocumentDetails] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
try something like this. SQL Fiddle
DECLARE #XMLdata XML = '<?xml version="1.0" encoding="utf-8"?>
<document name="COM1-0000000011" type="Commercial_Doc" identifier="02fa318a-bd80-4f73-97bb-141884fbcff5" description="" client="Level 4" process="LEVEL 4 - Commercial" deleted="False">
<field name="Email_From" type="String" identifier="d167bea7-2ec6-498e-9a8a-3d0e6f37b6b3" value="aa#abcd.com" />
<field name="Email_To" type="String" identifier="9f9ad742-502b-44e4-b223-ae048b395bd3" value="bb#abcd.com" />
<field name="Email_Subject" type="String" identifier="cb7c7194-bc4c-4e44-b9b6-7643f1faca13" value="Second set" />
<field name="Email_EmailDate" type="DateTime" identifier="7476b62b-ec35-432b-8d50-572ed504133e" value="03/18/2015 04:05:09" />
<field name="Email_LocalDate" type="DateTime" identifier="ce571c82-440a-4ffd-8ee9-ebf53c1e9071" value="03/18/2015 09:35:09" />
<field name="Email_ReceivedDate" type="String" identifier="f007da05-2ffa-4290-9f28-6cd15de3c5b1" value="03/18/2015 09:35:10" />
<field name="Email_Charset" type="String" identifier="237a7237-b57a-404c-9fdb-39eca5a0d197" value="us-ascii" />
<field name="Email_PreferredCharset" type="String" identifier="f577b3b5-46a2-45ea-8db5-f1b8dc478d2b" value="" />
<field name="OutputImageFile" type="String" identifier="bec3db3f-21c0-4491-99e2-ea32e0f2b788" value="E:\Level 4\ComDoc\Output\02fa318a-bd80-4f73-97bb-141884fbcff5.PDF" />
<table name="itemdata" />
</document>'
SELECT
[Name] = TempTable.t.value('#name[1]','nvarchar(120)')
,[Type] = TempTable.t.value('#type[1]','nvarchar(120)')
,[Identifier] = TempTable.t.value('#identifier[1]','nvarchar(120)')
,[Value] = TempTable.t.value('#value[1]','nvarchar(120)')
FROM
#XMLdata.nodes('/document/field')AS TempTable(t)
The query does not cater to the item "ItemType" column. you can add it to the XML as required.

SQL Templating in SmartGWT

I am trying to use SQL templating in smartgwt to load data from my database into a listgrid but I am not able to get the desired result. This is the raw SQL query which I am trying to adopt in SmartGWT to get the result
SELECT
dbo.province.provincename as province,
dbo.province.capital,
dbo.province.code,
dbo.province.telcode,
dbo.province.taxcode,
dbo.county.countyname as county,
dbo.district.districtname as district,
dbo.zone.alternateName as zone,
dbo.neighbourhood.alternateName as neigbhour,
dbo.city.cityname as city,
dbo.city.taxcode,
dbo.city.fdocode,
count(dbo.customer.customeraltname) as countCustomer
FROM
dbo.county
INNER JOIN
dbo.province
ON
(
dbo.county.provinceID = dbo.province.id)
INNER JOIN
dbo.district
ON
(
dbo.county.id = dbo.district.countyID)
INNER JOIN
dbo.city
ON
(
dbo.district.id = dbo.city.districtID)
INNER JOIN
dbo.zone
ON
(
dbo.city.id = dbo.zone.cityId)
INNER JOIN
dbo.neighbourhood
ON
(
dbo.zone.id = dbo.neighbourhood.zoneId)
INNER JOIN
dbo.customer
ON
(
dbo.neighbourhood.id = dbo.customer.neighbourhoodId)
Group By dbo.province.provincename,
dbo.province.capital,
dbo.province.code,
dbo.province.telcode,
dbo.province.taxcode,
dbo.county.countyname,
dbo.district.districtname,
dbo.zone.alternateName,
dbo.neighbourhood.alternateName,
dbo.city.cityname,
dbo.city.taxcode,
dbo.city.fdocode
Below is my ds.xml
<DataSource ID="CusNeiGroupDS" serverType="sql">
<fields>
<field name="id" type="integer" />
<field name="provincename" title="province" type="text"/>
<field name="capital" title="capital" type="text"/>
<field name="code" title="code" type="text"/>
<field name="telcode" title="telcode" type="text"/>
<field name="taxcode" title="taxcode" type="text" />
<field name="provinceId" type="integer" tableName="county"/>
<field name="countyname" title="county" type="text" tableName="county"/>
<field name="district" title="district" type="text" />
<field name="city" title="city" type="text" />
<field name="zone" title="zone" type="text" />
<field name="neighbour" title="neighbour" type="text" />
<field name="taxcodecity" title="taxcodecity" type="text"
/>
<field name="fdocode" title="fdocode" type="text" />
<!-- <field name="countCustomer" title="countCustomer" type="int" /> -->
</fields>
<operationBindings>
<operationBinding operationId="summary"
operationType="fetch">
<selectClause>
districtname as
district,
alternateName as zone,
alternateName as neigbhour,
cityname
as city,
fdocode
</selectClause>
<tableClause>province, county, district, zone, neighbourhood, city
</tableClause>
<whereClause>
province.Id = county.provinceId
AND district.countyId = county.Id
AND city.districtId = district.Id
AND neighbourhood.zoneId = zone.Id
</whereClause>
</operationBinding>
</operationBindings>
the error I get is
Execute of select: SELECT COUNT(*) FROM CusNeiGroupDS WHERE ('1'='1')
on db: SQLServer threw exception: java.sql.SQLException: Invalid
object name 'CusNeiGroupDS'. - assuming stale connection and retrying
query.
But when I put the table name in the datasource like this,I get output but only from that table which I mention and not from the other tables which are joined with FK.
<DataSource ID="CusNeiGroupDS" serverType="sql" tableName="province">
I was able to achieve this with using includeFrom and foreignKey tags in the datasources. Then create another datasource where i use it to include all the coumns I need from the different tables.Like so
<DataSource ID="neighbourDS_1" serverType="sql" tableName="neighbourhood" inheritsFrom="neighbourDS">
<fields>
<field name="provincename" includeFrom="provinceDS.provincename" />
<field name="capital" includeFrom="provinceDS.capital" />
<field name="code" includeFrom="provinceDS.code" />
<field name="telcode" includeFrom="provinceDS.telcode" />
<field name="countyname" includeFrom="countyDS.countyname" />
<field name="district" includeFrom="districtDS.districtname" />
<field name="city" includeFrom="cityDS.cityname" />
<field name="taxcodecity" includeFrom="cityDS.taxcodecity" />
<field name="fdocode" includeFrom="cityDS.fdocode" />
<field name="zone" includeFrom="zoneDS.zone" />
</fields>
</DataSource>

How to get the xml node based on condition in sql server

This is my xml
DECLARE #XMLValues XML
SET #XMLValues = '<?xml version="1.0" encoding="UTF-8"?>
<DOCUMENTS name="NYSPIT">
<DOCUMENT ID="140208512T200911101">
<REPEATS>
<REPEAT NAME="EXCEPTIONS">
<ROW>
<FIELD VALUE="09_NYC-3A_2" NAME="PageType"/>
<FIELD VALUE="" NAME="KeyWord"/>
<FIELD VALUE="020852009111001.002" NAME="ImageName"/>
<FIELD VALUE="2" NAME="PageNo"/>
<FIELD VALUE="" NAME="Qualifier"/>
</ROW>
</REPEAT>
</REPEATS>
</DOCUMENT>
<DOCUMENT ID="140208512T200911102">
<REPEATS>
<REPEAT NAME="EXCEPTIONS">
<ROW>
<FIELD VALUE="09_NYC-3A_2" NAME="PageType"/>
<FIELD VALUE="" NAME="KeyWord"/>
<FIELD VALUE="020852009111001.002" NAME="ImageName"/>
<FIELD VALUE="2" NAME="PageNo"/>
<FIELD VALUE="" NAME="Qualifier"/>
</ROW>
</REPEAT>
</REPEATS>
</DOCUMENT>
</DOCUMENTS>
and i need to retrieve the XML node for ID - 140208512T200911101 alone. i cant able to get the information using various methods, still didnt get the correct one.
my desired result should be like this :
<DOCUMENT ID="140208512T200911101">
<REPEATS>
<REPEAT NAME="EXCEPTIONS">
<ROW>
<FIELD VALUE="09_NYC-3A_2" NAME="PageType"/>
<FIELD VALUE="" NAME="KeyWord"/>
<FIELD VALUE="020852009111001.002" NAME="ImageName"/>
<FIELD VALUE="2" NAME="PageNo"/>
<FIELD VALUE="" NAME="Qualifier"/>
</ROW>
</REPEAT>
</REPEATS>
</DOCUMENT>
Please help on this...
Thanks for your support and it is working fine, for getting the #ID value dynamically from a variable we need to user like this :
DECLARE #DCN Varchar(50)
SET #DCN = '140208512T200911101'
select #XMLValues.query('/DOCUMENTS/DOCUMENT[#ID = sql:variable("#DCN")]')
select #XMLValues.query('/DOCUMENTS/DOCUMENT[#ID = "140208512T200911101"]')
Result
<DOCUMENT ID="140208512T200911101">
<REPEATS>
<REPEAT NAME="EXCEPTIONS">
<ROW>
<FIELD VALUE="09_NYC-3A_2" NAME="PageType" />
<FIELD VALUE="" NAME="KeyWord" />
<FIELD VALUE="020852009111001.002" NAME="ImageName" />
<FIELD VALUE="2" NAME="PageNo" />
<FIELD VALUE="" NAME="Qualifier" />
</ROW>
</REPEAT>
</REPEATS>
</DOCUMENT>

solr DIH - A problem about solr delta-imports

There is a problem when I use solr1.3 delta-imports to update the index. I have added the "last_modified" column in the table. After I use the "full-import" command to index the database data, the "dataimport.properties" file contains nothing, and when I use the "delta-import" command to update index, the solr list all the data in database not the lasted data. My db-data-config.xml:
deltaQuery="select shop_id from shop where last_modified > '${dataimporter.last_index_time}'">
<?xml version="1.0" encoding="UTF-8" ?>
<dataConfig>
<dataSource driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/funguide" user="root" password="root"/>
<document name="shopinfo">
<entity name="shop" pk="shop_id"
query="select shop_id,title,description,tel,address,longitude,latitude from shop"
<field column="shop_id" name="id" />
<field column="title" name="title" />
<field column="description" name="description" />
<field column="tel" name="tel" />
<field column="address" name="address" />
<field column="longitude" name="longitude" />
<field column="latitude" name="latitude" />
</entity>
</document>
</dataConfig>
Anyboby know how to solve the problem? Thanks!
enzhaohoo#gmail.com
I also would recommend upgrading to Solr 1.4 RC as there have been quite a few improvements made to delta-imports with DataImportHandler. Please see DataImportHandler - Using delta-import command - wikipage for specifics.

Resources