/ / Comment passer d'une table à une procédure stockée? - sql-server, tsql, procédures stockées

Comment passer d'une table à une procédure stockée? - sql-server, tsql, procédures stockées

Je fais ma première tentative pour créer un stockprocedure (en utilisant VS2012 pour éditer) J'essaie de transmettre à ma procédure stockée une table à deux colonnes. Cependant, lorsque je clique sur analyser pour vérifier mon code, les erreurs suivantes apparaissent.

Msg 156, Niveau 15, Etat 1, Ligne 1
Syntaxe incorrecte près du mot clé "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 de la première, mais je n'ai aucune idée de ce qui cause la première. Autant que je sache, 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 que mon application de bureau C # utilise cette procédure stockée.

Réponses:

4 pour la réponse № 1

Les paramètres table sont disponibles à partir de SQL Server 2008 - à en juger par le message d'erreur, vous êtes le plus susceptible ne pas courir contre une instance de 2008 ....

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

Découvrez-le en utilisant SELECT @@VERSION contre votre serveur - que rapporte-t-il?


0 pour la réponse № 2

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 autre chose 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 = p.t