Skip to content

Instantly share code, notes, and snippets.

@ststeiger
Last active April 18, 2019 09:57
Show Gist options
  • Select an option

  • Save ststeiger/55b6f8bb8921cceef5e4 to your computer and use it in GitHub Desktop.

Select an option

Save ststeiger/55b6f8bb8921cceef5e4 to your computer and use it in GitHub Desktop.
Multi-Value Parameter directly in SQL from string.Join(array, ",")
CREATE FUNCTION [dbo].[tfu_RPT_SEL_FromXML]
(
@in_xml xml
)
RETURNS TABLE
AS
RETURN
(
SELECT tempNodes.innerXML.value('.', 'varchar(36)') AS val
FROM @in_xml.nodes('e') AS tempNodes(innerXML)
)
GO
SELECT * FROM tfu_RPT_SEL_FromXML(CAST('<e>' + REPLACE('a,b,c', ',', '</e><e>') + '</e>' AS xml) )
SELECT * FROM tfu_RPT_SEL_FromXML('<e>foo</e><e>bar</e>')
-- ----------------------------------------------
DECLARE @in_geschoss varchar(MAX)
SET @in_geschoss = 'uid1,uid2,uid3'
SELECT * FROM T_AP_Geschoss
WHERE (1=1)
AND T_AP_Geschoss.GS_UID IN
(
SELECT val
FROM tfu_RPT_SEL_FromXML
(
CAST('<e>' + REPLACE(@in_geschoss, ',', '</e><e>') + '</e>' AS xml)
)
)
-- ------------------------------------------------------------
DECLARE @uids varchar(MAX)
SET @uids = '7B8240B4-F9E3-46DA-854A-04735F9CC46F,BC77931E-508B-4F3C-93CA-05B26C60BB1B,799E009D-94F5-4CCE-96C1-07B4C23CB13C,085051FB-0EF4-43F2-9887-08CA600834DE,80CF2F05-6E92-41B3-BF3C-0969BED4F590,AA6E70CF-A475-4358-B9D7-0A501F461274'
-- http://stackoverflow.com/questions/14712864/how-to-query-values-from-xml-nodes
-- Anstatt tfu_RPT_SEL_FromXML
SELECT * FROM T_AP_Gebaeude
WHERE GB_UID IN
(
SELECT
x.XmlCol.value('.', 'varchar(36)') AS val
FROM
(
SELECT
CAST('<e>' + REPLACE(@uids, ',', '</e><e>') + '</e>' AS xml) AS RawXml
) AS b
CROSS APPLY b.RawXml.nodes('e') x(XmlCol)
)
-------
SELECT *
FROM
(
SELECT
CAST('<e>' + REPLACE(@uids, ',', '</e><e>') + '</e>' AS xml) AS RawXml
) AS b
-----------
SELECT
--myTempTable.XmlCol.value('.', 'varchar(36)') AS val
myTempTable.XmlCol.query('./ID').value('.', 'varchar(36)') AS ID
,myTempTable.XmlCol.query('./Name').value('.', 'nvarchar(MAX)') AS Name
,myTempTable.XmlCol.query('./RFC').value('.', 'nvarchar(MAX)') AS RFC
,myTempTable.XmlCol.query('./Text').value('.', 'nvarchar(MAX)') AS Text
,myTempTable.XmlCol.query('./Desc').value('.', 'nvarchar(MAX)') AS Description
FROM
(
SELECT CONVERT(XML, BulkColumn) AS RawXml
FROM OPENROWSET(BULK 'D:\stefan.steiger\Downloads\MyData.xml', SINGLE_BLOB) AS RowSetName
) AS b
CROSS APPLY b.RawXml.nodes('//record') myTempTable(XmlCol);
SELECT
--myTempTable.XmlCol.value('.', 'varchar(36)') AS val
myTempTable.XmlCol.query('./ID').value('.', 'varchar(36)') AS ID
,myTempTable.XmlCol.query('./Name').value('.', 'nvarchar(MAX)') AS Name
,myTempTable.XmlCol.query('./RFC').value('.', 'nvarchar(MAX)') AS RFC
,myTempTable.XmlCol.query('./Text').value('.', 'nvarchar(MAX)') AS Text
,myTempTable.XmlCol.query('./Desc').value('.', 'nvarchar(MAX)') AS Description
--,myTempTable.XmlCol.value('(Desc)[1]', 'nvarchar(MAX)') AS DescMeth2
FROM
(
SELECT
CAST('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<data-set>
<record>
<ID>1</ID>
<Name>A</Name>
<RFC>RFC 1035[1]</RFC>
<Text>Address record</Text>
<Desc>Returns a 32-bit IPv4 address, most commonly used to map hostnames to an IP address of the host, but it is also used for DNSBLs, storing subnet masks in RFC 1101, etc.</Desc>
</record>
<record>
<ID>2</ID>
<Name>NS</Name>
<RFC>RFC 1035[1]</RFC>
<Text>Name server record</Text>
<Desc>Delegates a DNS zone to use the given authoritative name servers</Desc>
</record>
</data-set>
' AS xml) AS RawXml
) AS b
--CROSS APPLY b.RawXml.nodes('//record/ID') myTempTable(XmlCol);
CROSS APPLY b.RawXml.nodes('//record') myTempTable(XmlCol);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment