如何将表传递给存储过程?

时间:2014-07-29 13:56:04

标签: sql-server tsql stored-procedures

我第一次尝试创建存储过程(使用VS2012进行编辑)我试图通过我的存储过程传递一个包含两列的表。但是当我点击解析检查我的代码时,我得到以下错误。

  

第15行,第1行,第1行,第1行   关键字' AS'附近的语法不正确。

     

Msg 102,Level 15,State 1,Procedure SaveMsgData,Line 10
  ' READONLY'附近的语法不正确。

     

Msg 1087,Level 15,State 2,Procedure SaveMsgData,Line 45
  必须声明表变量" @ tagList"。

我认为最后两个错误源于第一个,但我不知道是什么导致了第一个错误。据我所知,我的语法是正确的。

这是我的完整代码。

CREATE TYPE TagListType AS TABLE
(                     
       TagID varchar(100),                
       AntNum int
);
GO

CREATE PROCEDURE SaveMsgData 
    @Mac nvarchar(30),
    @tagList TagListType READONLY
AS
    DECLARE @ReaderID int
    DECLARE @AntList TABLE (AntennaID int, AntNum int)

    SELECT @ReaderID = -1

    SELECT @ReaderID = Id
    FROM dbo.Readers
    WHERE MAC = @Mac

    IF (@ReaderID >= 0)
    BEGIN
        INSERT INTO @AntList (AntennaID,Antnum,TargetNumOfTags) 
            SELECT id, AntennaNumber, numOfTags 
            FROM Antennae
            WHERE ID = @ReaderID

        DECLARE @count int
        DECLARE @len int                    

        SET @count = 0
        SET @len = 0

        WHILE @count <= @len
        BEGIN
            DECLARE @LocalAnt int
            DECLARE @LocalTarget int
            DECLARE @LocalAntID int
            DECLARE @LocalStatus int
            DECLARE @LocalTagsRead int

            SELECT @LocalAnt = Antnum, @LocalTarget = TargetNumOfTags, @LocalAntID = AntID 
            FROM #AntList 
            WHERE Antnum = @count

            SELECT @LocalTagsRead = COUNT(*) FROM @tagList WHERE AntNum = @count

            IF @LocalTagsRead = @LocalTarget
            BEGIN
                SET @LocalStatus = 0
            END
        ELSE
            BEGIN
                SET @LocalStatus = 1
            END

        INSERT INTO Readings 
        VALUES (@LocalStatus, @LocalTarget, @LocalTagsRead, CURRENT_TIMESTAMP, @LocalAntID, @ReaderID)

        --Will insert Tags in to tag table here later.
        SET @count = @count + 1
    END
END
GO

这里的目的是让我的C#桌面应用程序使用这个存储过程。

2 个答案:

答案 0 :(得分:4)

从SQL Server 2008 开始,表值参数可用 - 从错误消息判断,您很可能针对2008实例运行....

您真的使用的是2008或更新的服务器引擎吗?

使用SELECT @@VERSION针对您的服务器查找 - 它会报告什么内容?

答案 1 :(得分:0)

您可以使用此功能传递CSV参数并将其转换为XML:

create function udf_CsvToXML(@Csv as varchar(4096),@Delim as varchar(15)=',')
returns xml
as
begin
    declare @xml as xml = CAST('<XML>'+('<X>'+REPLACE(@Csv,@Delim,'</X><X>')+'</X></XML>') AS XML)
    return @xml
end

然后,您可以在连接中使用XML或其他任何内容,就好像它是一个表:

DECLARE @TitlesXML as XML = dbo.udf_CsvToXML(@Titles,',')
select distinct t
from p
join    (SELECT N.value('.[1]', 'varchar(25)') as value FROM @TitlesXML.nodes('/XML/X') as T(N)) tt
    on tt.value = p.t