代码之家  ›  专栏  ›  技术社区  ›  John Källén

如何将数据集合传递到SQLServer2003中的T-SQL存储过程中

  •  2
  • John Källén  · 技术社区  · 15 年前

    我有一个存储过程,理想情况下应该能够从数据库客户端接受NVARCHAR列表/表。我知道SQLServer2008中的表参数,但我一直在运行SQLServer2003。

    目前,我在客户端用分隔符连接字符串,将结果字符串作为NVARCHAR参数传递,然后在进入存储过程时分离字符串,但这还有很多需要改进的地方。

    2 回复  |  直到 15 年前
        1
  •  3
  •   Rowland Shaw    15 年前

    您看过传入XML吗?

    因此,对于XML,有点像:

    <ArrayOfService xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <Service Id="2" Name="AUSTRALIA" Code="AUS" />
      <Service Id="10" Name="FAR EAST" Code="FEE" />
    </ArrayOfService>
    

    在SQL Server 2005中,您可以执行以下操作:

    -- Lookup Services
    DECLARE @ServiceXml AS XML
    
    CREATE TABLE #Service
    (
        Id INT,
        [Name] VARCHAR( 50 ),
        Code VARCHAR( 10 )
    )
    
    INSERT INTO #Service
    (
        Id,
        [Name],
        Code
    )
    SELECT
        CASE
            WHEN LegsTbl.rows.value('@Id', 'nvarchar(255)') = '' THEN NULL
            WHEN LegsTbl.rows.value('@Id', 'int') = 0 THEN NULL
            ELSE LegsTbl.rows.value('@Id', 'int')
        END AS Id,
        LegsTbl.rows.value('@Name', 'varchar(50)') AS [Name],
        LegsTbl.rows.value('@Code', 'varchar(50)') AS TopazCode
    FROM
        @ServiceXml.nodes('/ArrayOfService/Service') LegsTbl(rows)
    

    或SQL Server 2000:

    DECLARE @ServiceXml AS NTEXT
    DECLARE @iServiceXml AS INT
    
    --Create an internal representation of the XML document.
    EXEC sp_xml_preparedocument @iServiceXml OUTPUT, @ServiceXml
    
    CREATE TABLE #Service
    (
        Id INT,
        [Name] VARCHAR( 50 ),
        Code VARCHAR( 10 )
    )
    
    INSERT INTO #Service
    (
        Id,
        [Name],
        Code
    )
    SELECT
        Id,
        Name,
        Code
    FROM
    OPENXML( @iServiceXml, '/ArrayOfService/Service', 3)
        WITH (Link8Id   int '@Id',
              Name  varchar(50) '@Name',
              Code  varchar(10) '@TopazCode')
    
        2
  •  0
  •   n8wrl    15 年前

    CREATE PROCEDURE dbo.ig_SelectRecentConfigurableAppsByMakes
    (
        @MakesXML       XML,    -- <makes><value>GMC</value>...</makes>
        @TopN           INT
    )
    AS
        DECLARE @Makes TABLE (Make NVARCHAR(30))
        INSERT INTO @Makes
        SELECT ParamValues.make.value('.','NVARCHAR(30)')
          FROM @MakesXML.nodes('makes/value') AS ParamValues(make)
        ;