Comment passer une table à une procédure stockée?

Je fais ma première tentative de créer une procédure stockée (en utilisant VS2012 pour éditer) J'essaye de passer ma procédure stockée une table avec deux colonnes. Cependant quand je clique sur parsingr pour vérifier mon code j'obtiens les erreurs suivantes.

Msg 156, niveau 15, état 1, ligne 1
Syntaxe incorrecte près du mot key 'AS'.

Msg 102, niveau 15, état 1, procédure SaveMsgData, ligne 10
Syntaxe incorrecte près de "READONLY".

Msg 1087, niveau 15, état 2, procédure SaveMsgData, ligne 45
Doit déclarer la variable de table "@tagList".

Je pense que les deux dernières erreurs proviennent du premier, mais je n'ai aucune idée de ce qui cause la première. Autant que je peux dire ma syntaxe est correcte.

Voici mon code complet.

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 

L'intention ici est d'avoir mon application de bureau C # utiliser cette procédure stockée.

Les parameters de table sont disponibles à partir de SQL Server 2008 – à en juger par le message d'erreur, il est probable que vous ne soyez pas exécuté sur une instance de 2008 ….

Êtes-vous vraiment sur un moteur de server 2008 ou plus récent?

Découvrez-le en utilisant SELECT @@VERSION sur votre server – que rapporte-t-il?

Vous pouvez passer un paramètre CSV et le convertir en XML avec cette fonction:

 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 

Ensuite, vous pouvez utiliser le XML dans une jointure ou n'importe quoi d'autre comme s'il s'agissait d'une table:

 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 = pt