• SQL Server >> 关系运算符 OPENDATASOURCE \OPENJSON \OPENXML \OPENQUERY \OPENROWSET


    OPENJSON

    表值函数,解析JSON文本成集合。如果不指定WITH关键字,默认返回3个列,分别是key,value和type。参数2可以指定到具体的JSON节点。可以通过WITH关键字指定返回结果集合的列定义,WITH关键字即便是JOIN或者CROSS APPLY其他表的时候也是适用。

    DECLARE @json NVARCHAR(MAX) = N'[  
      {  
        "Order": {  
          "Number":"SO43659",  
          "Date":"2011-05-31T00:00:00"  
        },  
        "AccountNumber":"AW29825",  
        "Item": {  
          "Price":2024.9940,  
          "Quantity":1  
        }  
      },  
      {  
        "Order": {  
          "Number":"SO43661",  
          "Date":"2011-06-01T00:00:00"  
        },  
        "AccountNumber":"AW73565",  
        "Item": {  
          "Price":2024.9940,  
          "Quantity":3  
        }  
      }
    ]'  
       
    SELECT *
    FROM OPENJSON ( @json )  
    WITH (   
                  Number   VARCHAR(200)   '$.Order.Number',  
                  Date     DATETIME       '$.Order.Date',  
                  Customer VARCHAR(200)   '$.AccountNumber',  
                  Quantity INT            '$.Item.Quantity',  
                  [Order]  NVARCHAR(MAX)  AS JSON  
     )

     结果

    OPENXML

    表值函数,解析XML成集合。需要传入文本作为参数给到sp_xml_preparedocument返回XML文档数据编号,OPENXML打开解析sp_xml_preparedocument准备好的XML数据。sp_xml_removedocument移除sp_xml_preparedocument生成的XML数据。这点有点像游标的操作方法。可以通过WITH关键字指定返回结果集合的列定义,WITH关键字即便是JOIN或者CROSS APPLY其他表的时候也是适用。

    DECLARE @idoc INT, @doc VARCHAR(1000);   
    SET @doc ='  
    <ROOT>  
    <Customer CustomerID="VINET" ContactName="Paul Henriot">  
       <Order OrderID="10248" CustomerID="VINET" EmployeeID="5"   
               OrderDate="1996-07-04T00:00:00">  
          <OrderDetail ProductID="11" Quantity="12"/>  
          <OrderDetail ProductID="42" Quantity="10"/>  
       </Order>  
    </Customer>  
    <Customer CustomerID="LILAS" ContactName="Carlos Gonzlez">v  
       <Order OrderID="10283" CustomerID="LILAS" EmployeeID="3"   
               OrderDate="1996-08-16T00:00:00">  
          <OrderDetail ProductID="72" Quantity="3"/>  
       </Order>  
    </Customer>  
    </ROOT>';   
      
    --Create an internal representation of the XML document.  
    EXEC sp_xml_preparedocument @idoc OUTPUT, @doc;   
      
    -- SELECT stmt using OPENXML rowset provider  
    SELECT *  
    FROM   OPENXML (@idoc, '/ROOT/Customer/Order/OrderDetail',2)   
             WITH (OrderID       int         '../@OrderID',
                   CustomerID  varchar(10) '../@CustomerID',
                   OrderDate   datetime    '../@OrderDate',
                   ProdID      int         '@ProductID',
                   Qty         int         '@Quantity');

    结果

    OPENDATASOURCE

    作用类似于linked server,只不过linked server是通过服务器的对象链接,更加简便。而OPENSOURCE是通过指定连接驱动再跟着数据库表对象。从这点看它的实用性可定不及linked server。

    SELECT *  
    FROM OPENDATASOURCE('SQLNCLI',  
        'Data Source=London\Payroll;Integrated Security=SSPI')  
        .AdventureWorks2012.HumanResources.Employee;

    OPENROWSET

    用处比较多的一个语句,可以用来打开连接到第三方数据源,这里的数据源不限于数据库(mysql,sql server),也可以是EXCEL、CSV、TXT。

    打开平面数据文件

    SELECT *
    FROM OPENROWSET(BULK N'D:\XChange\test-csv.csv',
        FORMATFILE = N'D:\XChange\test-csv.fmt',
        FIRSTROW=2,
        FORMAT='CSV') AS cars;

    打开EXCEL文件见另外随笔SQL Server ->> 自动创建表并从文件加载数据

    打开SQL SERVER数据库连接。(这里显然实用性也是不及linked server,如果是经常访问的数据库,显然linked server的优势更大,使用更加简便。)

    SELECT a.*
    FROM OPENROWSET('SQLNCLI', 'Server=Seattle1;Trusted_Connection=yes;',
         'SELECT GroupName, Name, DepartmentID
          FROM AdventureWorks2012.HumanResources.Department
          ORDER BY GroupName, Name') AS a;

    OPENQUERY

     在指定的链接服务器上执行指定的DML操作。客户以是INSERT\DELETE\UPDATE\SELECT。前提是服务器是 OLE DB 数据源。

    参考:

    OPENJSON

    OPENXML

    OPENSOURCE

    OPENROWSET

    OPENQUERY

  • 相关阅读:
    海量数据中,寻找最小的k个数。
    快速排序
    反转一个单链表,分别以迭代和递归的形式来实现
    N个大小不等的自然数排序,时间复杂度为O(n),空间复杂度为O(1)
    堆排序
    两个已经排好序的链表合并为一个有序链表
    字符串过滤空格、回车、tab
    求一个浮点数的连续子序列最大乘积 (2013 小米校园招聘笔试题)
    单向循环链表队列,从头开始报数,当报到m或者m的倍数的元素出列
    给一个数组,元素都是整数(有正数也有负数),寻找连续的元素相加之和为最大的序列。
  • 原文地址:https://www.cnblogs.com/jenrrychen/p/16295618.html
Copyright © 2020-2023  润新知