存储过程能不能以表变量作为参数啊??

解决方案 »

  1.   

    如何传递表参数:
    先建立SalesHistory表,存放我的产品销售数据。下面的代码在我选择的数据库中建立表:
    IF OBJECT_ID(''SalesHistory'')>0 
    DROP TABLE SalesHistory;
    GO
    CREATE TABLE [dbo].[SalesHistory]

    [SaleID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY, 
    [Product] [varchar](10) NULL, 
    [SaleDate] [datetime] NULL, 
    [SalePrice] [money] NULL
    )
    GO
     
    第一步建立要使用的表值参数的table类型;这一步是必须的,只有这样,表结构才可以定义在数据库中,然后再在你的代码中使用它。下面的代码建立一个SalesHistoryTableType表类型定义:
    CREATE TYPE SalesHistoryTableType AS TABLE

    [Product] [varchar](10) NULL,
    [SaleDate] [datetime] NULL, 
    [SalePrice] [money] NULL
    )
    GO
    如果你想查看你系统中定义的table类型,可以执行下面的查询查看系统目录:
    SELECT * FROM sys.table_types
     
    我定义一个用来处理表值参数的存储过程。下面的过程处理一个为SalesHistoryTableType类型的表值参数,并将表值中Product列值为“BigScreen”的记录导入到SalesHistory中。
    CREATE PROCEDURE usp_InsertBigScreenProducts
    (
    @TableVariable SalesHistoryTableType READONLY
    )
    AS
    BEGIN
    INSERT INTO SalesHistory
    (
    Product, SaleDate, SalePrice
    )
    SELECT
    Product, SaleDate, SalePrice
    FROM
    @TableVariable
    WHERE
    an>Product = ''BigScreen'' END
    GO
    你可以像其他表一样查询表变量中的数据。
     
    传递表变量的限制:
    当你传递表值变量给过程的时候,你必须指定READONLY。表变量中的数据不可以修改,也不能用作OUTPUT参数,只可以用作INPUT参数。
     
    使用表变量:
    首先,我需要声明一个类型为SalesHistoryTableType的变量。我不需要在此定义表结构,因为已经在定义类型的时候定义了。
    DECLARE @DataTable AS SalesHistoryTableType
    The following script adds 1,000 records into my @DataTable table variable: 
    DECLARE @i SMALLINT
    SET @i = 1 WHILE (@i <=1000)
    BEGIN INSERT INTO @DataTable(Product, SaleDate, SalePrice) 
    VALUES (''Computer'', DATEADD(mm, @i, ''3/11/1919''), DATEPART(ms, GETDATE()) + (@i + 57)) INSERT INTO @DataTable(Product, SaleDate, SalePrice) 
    VALUES(''BigScreen'', DATEADD(mm, @i, ''3/11/1927''), DATEPART(ms, GETDATE()) + (@i + 13)) INSERT INTO @DataTable(Product, SaleDate, SalePrice) 
    VALUES(''PoolTable'', DATEADD(mm, @i, ''3/11/1908''), DATEPART(ms, GETDATE()) + (@i + 29)) SET @i = @i + 1
    END
    一旦我将数据导入到表变量中,我就可以传递这个结构到存储过程中(确定你添加数据到表变量并传递这个变量到过程,当存储过程返回时这个变量就停止活动)。
     
    注意:当表变量作为参数传递的时候,这个表的数据集存在于tempdb系统数据库而不是内存中。这样呢在处理大量数据的时候相当有效。所有服务器端传递的表变量参数都是通过引用传递的,一个引用就是指向tempdb中表的指针。
    EXECUTE usp_InsertBigScreenProducts
    @TableVariable = @DataTable
      

  2.   

    楼上的代码执行失败
    CREATE TYPE SalesHistoryTableType AS TABLE

    [Product] [varchar](10) NULL,
    [SaleDate] [datetime] NULL, 
    [SalePrice] [money] NULL
    )