我第一次尝试创建存储过程(使用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#桌面应用程序使用这个存储过程。
答案 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