Inserting XML generated by excel into sql table using OPENXML

Hi,
I want to insert this xml to sql table, the problem is that i dont get any row. the xml is generated by excel.interop.range.value in VB

i tried very tiemes to change the route but dosnt works
thanks
i attached the xml code

EXEC sp_xml_preparedocument @XMLDocPointer OUTPUT, @strXML
SELECT * FROM OPENXML(@XMLDocPointer,'/table') ' the route i changed vey time i add worbook/worksheet etc..
 EXEC sp_xml_removedocument @XMLDocPointer
DECLARE @XMLDocPointer INT
declare @strXML as varchar(8000) ='<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
 xmlns:o="urn:schemas-microsoft-com:office:office"
 xmlns:x="urn:schemas-microsoft-com:office:excel"
 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
 xmlns:html="http://www.w3.org/TR/REC-html40">
 <Styles>
  <Style ss:ID="Default" ss:Name="Normal">
   <Alignment ss:Vertical="Bottom"/>
   <Borders/>
   <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
   <Interior/>
   <NumberFormat/>
   <Protection/>
  </Style>
 </Styles>
 <Worksheet ss:Name="Hoja1">
  <Names>
   <NamedRange ss:Name="DatosExternos_1" ss:RefersTo="=Hoja1!R1C1:R2C13"/>
  </Names>
  <Table ss:ExpandedColumnCount="13" ss:ExpandedRowCount="2"
   ss:DefaultColumnWidth="60" ss:DefaultRowHeight="15">
   <Column ss:Width="52.5"/>
   <Column ss:Width="43.5"/>
   <Column ss:Width="51"/>
   <Column ss:Width="54.75"/>
   <Column ss:Width="48.75"/>
   <Column ss:Width="52.5" ss:Span="1"/>
   <Column ss:Index="8" ss:Width="38.25"/>
   <Column ss:Width="36.75"/>
   <Column ss:Width="48"/>
   <Column ss:Width="32.25"/>
   <Column ss:Width="27.75"/>
   <Row>
    <Cell><Data ss:Type="Number">1</Data><NamedCell ss:Name="DatosExternos_1"/></Cell>
    <Cell><Data ss:Type="String">Saul</Data><NamedCell ss:Name="DatosExternos_1"/></Cell>
    <Cell><Data ss:Type="String">Laniado</Data><NamedCell ss:Name="DatosExternos_1"/></Cell>
    <Cell><Data ss:Type="String">Roman</Data><NamedCell ss:Name="DatosExternos_1"/></Cell>
    <Cell><Data ss:Type="String"></Data><NamedCell ss:Name="DatosExternos_1"/></Cell>
    <Cell><Data ss:Type="String"></Data><NamedCell ss:Name="DatosExternos_1"/></Cell>
    <Cell><Data ss:Type="String"></Data><NamedCell ss:Name="DatosExternos_1"/></Cell>
    <Cell><Data ss:Type="String"></Data><NamedCell ss:Name="DatosExternos_1"/></Cell>
    <Cell><Data ss:Type="String">nuevo</Data><NamedCell ss:Name="DatosExternos_1"/></Cell>
    <Cell><Data ss:Type="String"></Data><NamedCell ss:Name="DatosExternos_1"/></Cell>
    <Cell><Data ss:Type="String">Sr.</Data><NamedCell ss:Name="DatosExternos_1"/></Cell>
    <Cell><Data ss:Type="String"></Data><NamedCell ss:Name="DatosExternos_1"/></Cell>
    <Cell><Data ss:Type="String"></Data><NamedCell ss:Name="DatosExternos_1"/></Cell>
   </Row>
  </Table>
 </Worksheet>
</Workbook>
'

EXEC sp_xml_preparedocument @XMLDocPointer OUTPUT, @strXML
 INSERT INTO Clientes SELECT * FROM OPENXML(@XMLDocPointer,'/table')with clientes

 
 EXEC sp_xml_removedocument @XMLDocPointer

Open in new window

Saul_lAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

BodestoneCommented:
I'm not totally sure since I have only skimmed XML but surely you need to declare @strXML as datatype XML rather than VARCHAR(8000)
0
Saul_lAuthor Commented:
i also tried it i need more detailed help
0
Anthony PerkinsCommented:
>>i also tried it i need more detailed help<<
Unfortunately, you have not told us anything.  What elements/attributes do you need to extract from the Xml document and how does it map to the Clientes table.  Also, post the structure (CREATE TABLE) of the table.
0
Big Business Goals? Which KPIs Will Help You

The most successful MSPs rely on metrics – known as key performance indicators (KPIs) – for making informed decisions that help their businesses thrive, rather than just survive. This eBook provides an overview of the most important KPIs used by top MSPs.

Anthony PerkinsCommented:
You are missing two fundemental points about Xml:
1. Your Xml uses namespaces, so you need to declare them.
2. Xml is case sensitive, so "table" <> "Table"

This is a start at providing a solution:  It shows you how to access an element and an attribute, by declaring the correct namespace and setting a valid XPath.
You will have to provide some additional feedback:
DECLARE @XMLDocPointer integer

DECLARE @strXML AS varchar(8000) = '
<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook	xmlns="urn:schemas-microsoft-com:office:spreadsheet"
			xmlns:o="urn:schemas-microsoft-com:office:office"
			xmlns:x="urn:schemas-microsoft-com:office:excel"
			xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
			xmlns:html="http://www.w3.org/TR/REC-html40">
	<Styles>
		<Style ss:ID="Default" ss:Name="Normal">
			<Alignment ss:Vertical="Bottom"/>
			<Borders/>
			<Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
			<Interior/>
			<NumberFormat/>
			<Protection/>
		</Style>
	</Styles>
	<Worksheet ss:Name="Hoja1">
		<Names>
			<NamedRange ss:Name="DatosExternos_1" ss:RefersTo="=Hoja1!R1C1:R2C13"/>
		</Names>
		<Table ss:ExpandedColumnCount="13" ss:ExpandedRowCount="2" ss:DefaultColumnWidth="60" ss:DefaultRowHeight="15">
			<Column ss:Width="52.5"/>
			<Column ss:Width="43.5"/>
			<Column ss:Width="51"/>
			<Column ss:Width="54.75"/>
			<Column ss:Width="48.75"/>
			<Column ss:Width="52.5" ss:Span="1"/>
			<Column ss:Index="8" ss:Width="38.25"/>
			<Column ss:Width="36.75"/>
			<Column ss:Width="48"/>
			<Column ss:Width="32.25"/>
			<Column ss:Width="27.75"/>
			<Row>
				<Cell>
					<Data ss:Type="Number">1</Data>
					<NamedCell ss:Name="DatosExternos_1"/>
				</Cell>
				<Cell>
					<Data ss:Type="String">Saul</Data>
					<NamedCell ss:Name="DatosExternos_1"/>
				</Cell>
				<Cell>
					<Data ss:Type="String">Laniado</Data>
					<NamedCell ss:Name="DatosExternos_1"/>
				</Cell>
				<Cell>
					<Data ss:Type="String">Roman</Data>
					<NamedCell ss:Name="DatosExternos_1"/>
				</Cell>
				<Cell>
					<Data ss:Type="String"></Data>
					<NamedCell ss:Name="DatosExternos_1"/>
				</Cell>
				<Cell>
					<Data ss:Type="String"></Data>
					<NamedCell ss:Name="DatosExternos_1"/>
				</Cell>
				<Cell>
					<Data ss:Type="String"></Data>
					<NamedCell ss:Name="DatosExternos_1"/>
				</Cell>
				<Cell>
					<Data ss:Type="String"></Data>
					<NamedCell ss:Name="DatosExternos_1"/>
				</Cell>
				<Cell>
					<Data ss:Type="String">nuevo</Data>
					<NamedCell ss:Name="DatosExternos_1"/>
				</Cell>
				<Cell>
					<Data ss:Type="String"></Data>
					<NamedCell ss:Name="DatosExternos_1"/>
				</Cell>
				<Cell>
					<Data ss:Type="String">Sr.</Data>
					<NamedCell ss:Name="DatosExternos_1"/>
				</Cell>
				<Cell>
					<Data ss:Type="String"></Data>
					<NamedCell ss:Name="DatosExternos_1"/>
				</Cell>
				<Cell>
					<Data ss:Type="String"></Data>
					<NamedCell ss:Name="DatosExternos_1"/>
				</Cell>
			</Row>
		</Table>
	</Worksheet>
</Workbook>' 
 
EXEC sp_xml_preparedocument @XMLDocPointer OUTPUT, @strXML, '<ROOT xmlns:ns="urn:schemas-microsoft-com:office:spreadsheet"
					xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"/>'
--INSERT INTO Clientes 
SELECT  Data,
		[Type]
FROM    OPENXML(@XMLDocPointer,'ns:Workbook/ns:Worksheet/ns:Table/ns:Row/ns:Cell/ns:Data') WITH (
			Data  varchar(20) '.',
			[Type]  varchar(20) '@ss:Type' 
            ) 
  
EXEC sp_xml_removedocument @XMLDocPointer

Open in new window

0
Saul_lAuthor Commented:
Thanks,
This is my entire problem i have this thable in sql (attsched)
I am using in VB.net the microsoft.office.iterop.excel
then i inset the table from SQL and give it a named range "clientes"
then using this code i extract the xml i will atach you the two possibilities that generate excel
the xlRangeValueMSPersistXML and the xlRangeValueXMLSpreadsheet

Dim Worksheet = CType(Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets(1),  _
        excel.Worksheet).GetVstoObject()
        Dim valores = Worksheet.Range("clientes").Value(excel.XlRangeValueDataType.xlRangeValueMSPersistXML)

This XML i want to insert to the same table after the user has made some changes.
(maybe there is another way to do that?)

hope this will help you to help me. Really thanks a lot.

Table
CREATE TABLE [dbo].[Clientes](
	[NoCliente] [int] IDENTITY(1,1) NOT NULL,
	[Nombre] [varchar](15) NOT NULL,
	[ApellidoP] [varchar](50) NULL,
	[ApellidoM] [varchar](50) NULL,
	[Direccion] [text] NULL,
	[Telefono1] [varchar](50) NULL,
	[Telefono2] [varchar](50) NULL,
	[Celular] [varchar](50) NULL,
	[Correo] [varchar](50) NULL,
	[Cobrador] [char](10) NULL,
	[Titulo] [varchar](10) NULL,
	[Zona] [varchar](15) NULL,
	[Comentario] [text] NULL)
------------------------------------------
<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
 xmlns:o="urn:schemas-microsoft-com:office:office"
 xmlns:x="urn:schemas-microsoft-com:office:excel"
 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
 xmlns:html="http://www.w3.org/TR/REC-html40">
 <Styles>
  <Style ss:ID="Default" ss:Name="Normal">
   <Alignment ss:Vertical="Bottom"/>
   <Borders/>
   <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
   <Interior/>
   <NumberFormat/>
   <Protection/>
  </Style>
  <Style ss:ID="s62">
   <Borders/>
  </Style>
 </Styles>
 <Worksheet ss:Name="Hoja1">
  <Table ss:ExpandedColumnCount="13" ss:ExpandedRowCount="3"
   ss:DefaultColumnWidth="60" ss:DefaultRowHeight="15">
   <Column ss:Width="52.5"/>
   <Column ss:Width="43.5"/>
   <Column ss:Width="51"/>
   <Column ss:Width="54.75"/>
   <Column ss:Width="48.75"/>
   <Column ss:Width="52.5" ss:Span="1"/>
   <Column ss:Index="8" ss:Width="38.25"/>
   <Column ss:Width="36.75"/>
   <Column ss:Width="48"/>
   <Column ss:Width="32.25"/>
   <Column ss:Width="27.75"/>
   <Row>
    <Cell ss:StyleID="s62"><Data ss:Type="Number">1</Data></Cell>
    <Cell ss:StyleID="s62"><Data ss:Type="String">Saul</Data></Cell>
    <Cell ss:StyleID="s62"><Data ss:Type="String">Laniado</Data></Cell>
    <Cell ss:StyleID="s62"><Data ss:Type="String">Roman</Data></Cell>
    <Cell ss:StyleID="s62"><Data ss:Type="String"></Data></Cell>
    <Cell ss:StyleID="s62"><Data ss:Type="String"></Data></Cell>
    <Cell ss:StyleID="s62"><Data ss:Type="String"></Data></Cell>
    <Cell ss:StyleID="s62"><Data ss:Type="String"></Data></Cell>
    <Cell ss:StyleID="s62"><Data ss:Type="String">nuevo</Data></Cell>
    <Cell ss:StyleID="s62"><Data ss:Type="String"></Data></Cell>
    <Cell ss:StyleID="s62"><Data ss:Type="String">Sr.</Data></Cell>
    <Cell ss:StyleID="s62"><Data ss:Type="String"></Data></Cell>
    <Cell ss:StyleID="s62"><Data ss:Type="String"></Data></Cell>
   </Row>
   <Row>
    <Cell><Data ss:Type="Number">37</Data></Cell>
    <Cell><Data ss:Type="String">david</Data></Cell>
    <Cell><Data ss:Type="String">cohen</Data></Cell>
   </Row>
   <Row>
    <Cell><Data ss:Type="Number">38</Data></Cell>
    <Cell><Data ss:Type="String">jorge</Data></Cell>
    <Cell><Data ss:Type="String">gonzales</Data></Cell>
    <Cell><Data ss:Type="String">perez</Data></Cell>
   </Row>
  </Table>
 </Worksheet>
</Workbook>
-----------------------------------
"<xml xmlns:x="urn:schemas-microsoft-com:office:excel"
 xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882"
 xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882"
 xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema">
 <x:PivotCache>
  <x:CacheIndex>1</x:CacheIndex>
  <s:Schema id="RowsetSchema">
   <s:ElementType name="row" content="eltOnly">
    <s:attribute type="Col1"/>
    <s:attribute type="Col2"/>
    <s:attribute type="Col3"/>
    <s:attribute type="Col4"/>
    <s:attribute type="Col5"/>
    <s:attribute type="Col6"/>
    <s:attribute type="Col7"/>
    <s:attribute type="Col8"/>
    <s:attribute type="Col9"/>
    <s:attribute type="Col10"/>
    <s:attribute type="Col11"/>
    <s:attribute type="Col12"/>
    <s:attribute type="Col13"/>
    <s:extends type="rs:rowbase"/>
   </s:ElementType>
   <s:AttributeType name="Col1" rs:name="NoCliente">
    <s:datatype dt:type="int"/>
   </s:AttributeType>
   <s:AttributeType name="Col2" rs:name="Nombre">
    <s:datatype dt:maxLength="255"/>
   </s:AttributeType>
   <s:AttributeType name="Col3" rs:name="ApellidoP">
    <s:datatype dt:maxLength="255"/>
   </s:AttributeType>
   <s:AttributeType name="Col4" rs:name="ApellidoM">
    <s:datatype dt:maxLength="255"/>
   </s:AttributeType>
   <s:AttributeType name="Col5" rs:name="Direccion">
    <s:datatype dt:maxLength="255"/>
   </s:AttributeType>
   <s:AttributeType name="Col6" rs:name="Telefono1">
    <s:datatype dt:maxLength="255"/>
   </s:AttributeType>
   <s:AttributeType name="Col7" rs:name="Telefono2">
    <s:datatype dt:maxLength="255"/>
   </s:AttributeType>
   <s:AttributeType name="Col8" rs:name="Celular">
    <s:datatype dt:maxLength="255"/>
   </s:AttributeType>
   <s:AttributeType name="Col9" rs:name="Correo">
    <s:datatype dt:maxLength="255"/>
   </s:AttributeType>
   <s:AttributeType name="Col10" rs:name="Cobrador">
    <s:datatype dt:maxLength="255"/>
   </s:AttributeType>
   <s:AttributeType name="Col11" rs:name="Titulo">
    <s:datatype dt:maxLength="255"/>
   </s:AttributeType>
   <s:AttributeType name="Col12" rs:name="Zona">
    <s:datatype dt:maxLength="255"/>
   </s:AttributeType>
   <s:AttributeType name="Col13" rs:name="Comentario">
    <s:datatype dt:maxLength="255"/>
   </s:AttributeType>
  </s:Schema>
  <rs:data>
   <z:row Col1="1" Col2="Saul" Col3="Laniado" Col4="Roman" Col9="nuevo"
    Col11="Sr."/>
   <z:row Col1="37" Col2="david" Col3="cohen"/>
   <z:row Col1="38" Col2="jorge" Col3="gonzales" Col4="perez"/>
  </rs:data>
 </x:PivotCache>
</xml>

Open in new window

0
Anthony PerkinsCommented:
This is how you do it:
DECLARE @XMLDocPointer integer

DECLARE @strXML AS varchar(8000) = '
<xml xmlns:x="urn:schemas-microsoft-com:office:excel"
 xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882"
 xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882"
 xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema">
	<x:PivotCache>
		<x:CacheIndex>1</x:CacheIndex>
		<s:Schema id="RowsetSchema">
			<s:ElementType name="row" content="eltOnly">
				<s:attribute type="Col1"/>
				<s:attribute type="Col2"/>
				<s:attribute type="Col3"/>
				<s:attribute type="Col4"/>
				<s:attribute type="Col5"/>
				<s:attribute type="Col6"/>
				<s:attribute type="Col7"/>
				<s:attribute type="Col8"/>
				<s:attribute type="Col9"/>
				<s:attribute type="Col10"/>
				<s:attribute type="Col11"/>
				<s:attribute type="Col12"/>
				<s:attribute type="Col13"/>
				<s:extends type="rs:rowbase"/>
			</s:ElementType>
			<s:AttributeType name="Col1" rs:name="NoCliente">
				<s:datatype dt:type="int"/>
			</s:AttributeType>
			<s:AttributeType name="Col2" rs:name="Nombre">
				<s:datatype dt:maxLength="255"/>
			</s:AttributeType>
			<s:AttributeType name="Col3" rs:name="ApellidoP">
				<s:datatype dt:maxLength="255"/>
			</s:AttributeType>
			<s:AttributeType name="Col4" rs:name="ApellidoM">
				<s:datatype dt:maxLength="255"/>
			</s:AttributeType>
			<s:AttributeType name="Col5" rs:name="Direccion">
				<s:datatype dt:maxLength="255"/>
			</s:AttributeType>
			<s:AttributeType name="Col6" rs:name="Telefono1">
				<s:datatype dt:maxLength="255"/>
			</s:AttributeType>
			<s:AttributeType name="Col7" rs:name="Telefono2">
				<s:datatype dt:maxLength="255"/>
			</s:AttributeType>
			<s:AttributeType name="Col8" rs:name="Celular">
				<s:datatype dt:maxLength="255"/>
			</s:AttributeType>
			<s:AttributeType name="Col9" rs:name="Correo">
				<s:datatype dt:maxLength="255"/>
			</s:AttributeType>
			<s:AttributeType name="Col10" rs:name="Cobrador">
				<s:datatype dt:maxLength="255"/>
			</s:AttributeType>
			<s:AttributeType name="Col11" rs:name="Titulo">
				<s:datatype dt:maxLength="255"/>
			</s:AttributeType>
			<s:AttributeType name="Col12" rs:name="Zona">
				<s:datatype dt:maxLength="255"/>
			</s:AttributeType>
			<s:AttributeType name="Col13" rs:name="Comentario">
				<s:datatype dt:maxLength="255"/>
			</s:AttributeType>
		</s:Schema>
		<rs:data>
			<z:row Col1="1" Col2="Saul" Col3="Laniado" Col4="Roman" Col9="nuevo"
    Col11="Sr."/>
			<z:row Col1="37" Col2="david" Col3="cohen"/>
			<z:row Col1="38" Col2="jorge" Col3="gonzales" Col4="perez"/>
		</rs:data>
	</x:PivotCache>
</xml>'
EXEC sp_xml_preparedocument @XMLDocPointer OUTPUT, @strXML, 
					--'<ROOT xmlns:ns="urn:schemas-microsoft-com:office:spreadsheet"
					--xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"/>'
					'<ROOT xmlns:x="urn:schemas-microsoft-com:office:excel"
					xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882"
					xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882"
					xmlns:rs="urn:schemas-microsoft-com:rowset" 
					xmlns:z="#RowsetSchema"/>'
					
-- Since NoCliente is an IDENTITY column you need to enble inserting into it. 
SET IDENTITY_INSERT Clientes ON

INSERT	Clientes (
	NoCliente, Nombre, ApellidoP, ApellidoM, Direccion, Telefono1,
	Telefono2, Celular, Correo, Cobrador, Titulo, Zona, Comentario)
SELECT  NoCliente, Nombre, ApellidoP, ApellidoM, Direccion, Telefono1,
	Telefono2, Celular, Correo,	Cobrador, Titulo, Zona, Comentario
FROM    OPENXML(@XMLDocPointer,'xml/x:PivotCache/rs:data/z:row') WITH (
		NoCliente integer '@Col1',
		Nombre varchar(15) '@Col2',
		ApellidoP varchar(50) '@Col3',
		ApellidoM varchar(50) '@Col4',
		Direccion text '@Col5',
		Telefono1 varchar(50) '@Col6',
		Telefono2 varchar(50) '@Col7',
		Celular varchar(50) '@Col8',
		Correo varchar(50) '@Col9',
		Cobrador varchar(50) '@Col10',
		Titulo varchar(50) '@Col11',
		Zona varchar(50) '@Col12',
		Comentario varchar(50) '@Col13'
            ) 

-- Don't forget to disable it after the INSERT statement
SET IDENTITY_INSERT Clientes OFF
  
EXEC sp_xml_removedocument @XMLDocPointer

SELECT  NoCliente, Nombre, ApellidoP, ApellidoM, Direccion, Telefono1,
        Telefono2, Celular, Correo,	Cobrador, Titulo, Zona, Comentario
FROM    Cliente

OUTPUT:
NoCliente	Nombre	ApellidoP	ApellidoM	Direccion	Telefono1	Telefono2	Celular	Correo	Cobrador	Titulo	Zona	Comentario
1	Saul	Laniado	Roman	NULL	NULL	NULL	NULL	nuevo	NULL	Sr.	NULL	NULL
37	david	cohen	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL
38	jorge	gonzales	perez	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL

Open in new window

0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Microsoft SQL Server

From novice to tech pro — start learning today.