Itérer sur une liste de chaînes de caractères Dans SQL Server?

Comment voulez-vous accéder à la valeur dans une liste de T-SQL?

J'ai une instruction SQL qui boucle et comptabilise le nombre de fois qu'une valeur s'affiche dans une colonne spécifique dans Table_1. Ensuite, il insère les valeurs requises dans leurs colonnes sur Table_2 ou si la ligne de la dose n'existe pas, il ajoute une nouvelle ligne et ajoute les données nécessaires.

J'ai créé la liste ou le tableau pour être exact,

DECLARE @MyList TABLE (Value NVARCHAR(50))
INSERT INTO @MyList VALUES ('Data1')
INSERT INTO @MyList VALUES ('Data2')
INSERT INTO @MyList VALUES ('Data3')
INSERT INTO @MyList VALUES ('Data4')
INSERT INTO @MyList VALUES ('Data5')
INSERT INTO @MyList VALUES ('Data6')
INSERT INTO @MyList VALUES ('Data7')
INSERT INTO @MyList VALUES ('Data8')

L'état fonctionne très bien, mais j'ai tout codé en dur et je veux ajouter un peu de dynamique de l'insertion de données, j'ai donc créé une liste de valeurs (Chaînes de caractères). Maintenant, je ne peux pas accéder aux valeurs de la façon dont je pensais que je pouvais.

C'est l'ensemble de la déclaration,

DECLARE @cnt INT = 1;
DECLARE @MyList TABLE (Value NVARCHAR(50))
INSERT INTO @MyList VALUES ('Data1')
INSERT INTO @MyList VALUES ('Data2')
INSERT INTO @MyList VALUES ('Data3')
INSERT INTO @MyList VALUES ('Data4')
INSERT INTO @MyList VALUES ('Data5')
INSERT INTO @MyList VALUES ('Data6')
INSERT INTO @MyList VALUES ('Data7')
INSERT INTO @MyList VALUES ('Data8')
WHILE @cnt < 9
BEGIN
IF EXISTS (SELECT * FROM Staff_Manager.dbo.Staff_Count_TBL WHERE Staff_No = 3201 AND Year_D = 2016 AND Month_D = 6 AND Column_Index = @cnt)
BEGIN
UPDATE Staff_Manager.dbo.Staff_Count_TBL 
SET Column_Value = (
SELECT COUNT(*)  
FROM Staff_Manager.dbo.Staff_Time_TBL
WHERE Staff_No = 3201 AND Date_Data BETWEEN '2016/6/1' AND '2016/7/1' AND Info_Data = 'Data_1'
GROUP BY Staff_No, Info_Data),
Column_Value2 = 'Data1'
WHERE Staff_No = 3201 AND Year_D = 2016 AND Month_D = 6 AND Column_Index = @cnt
END
ELSE
BEGIN
INSERT INTO Staff_Manager.dbo.Staff_Count_TBL 
(Staff_No, Year_D, Month_D, Column_Index, Column_Value, Column_Value2)
SELECT 3201, 2016, 6, @cnt, COUNT(*), 'Data1' 
FROM Staff_Manager.dbo.Staff_Time_TBL
WHERE Staff_No = 3201 AND Date_Data BETWEEN '2016/6/1' AND '2016/7/1' AND Info_Data = 'Data1' 
GROUP BY Staff_No, Info_Data
END
SET @cnt = @cnt + 1
END

Ce que je suis en train de réaliser est d'une boucle sur une liste qui a 8 éléments et entrez ces valeurs dans leur corrosponding colonnes.

Par exemple,

Sur cette ligne que j'ai codé en dur Data1,

WHERE Staff_No = 3201 AND Date_Data 
BETWEEN '2016/6/1' AND '2016/7/1' AND Info_Data = 'Data1'

Ce que je suis en train de faire est de cela,

WHERE Staff_No = 3201 AND Date_Data 
BETWEEN '2016/6/1' AND '2016/7/1' AND Info_Data = @MyList[@cnt]

Et ce,

SELECT 3201, 2016, 6, @cnt, COUNT(*), @MyList[@cnt] 
FROM Staff_Manager.dbo.Staff_Time_TBL                           
WHERE Staff_No = 3201 AND Date_Data 
BETWEEN '2016/6/1' AND '2016/7/1' AND Info_Data = @MyList[@cnt] 

Mais qui ne fonctionne pas. Après des recherches un peu plus, j'ai trouvé que le T-SQL ne permet pas réellement faire une liste , mais une Table temporaire pour ainsi dire-et vous avez besoin pour obtenir la valeur à partir de là. Malheureusement je n'arrive pas à trouver quelque chose à travailler.

J'ai un UPDATE et un INSERT déclaration que j'ai besoin d'ajouter de la valeur à partir de la liste.

EDIT: Dernière minute code de peaufinage,

DECLARE @cnt INT = 1;
DECLARE @MyList TABLE (Value NVARCHAR(50))
INSERT INTO @MyList VALUES ('Data1')
INSERT INTO @MyList VALUES ('Data2')
INSERT INTO @MyList VALUES ('Data3')
INSERT INTO @MyList VALUES ('Data4')
INSERT INTO @MyList VALUES ('Data5')
INSERT INTO @MyList VALUES ('Data6')
INSERT INTO @MyList VALUES ('Data7')
INSERT INTO @MyList VALUES ('Data8') 
INSERT INTO @MyList VALUES ('Data9')
INSERT INTO @MyList VALUES ('Data10')
INSERT INTO @MyList VALUES ('Data11')
INSERT INTO @MyList VALUES ('Data12')
INSERT INTO @MyList VALUES ('Data13')
INSERT INTO @MyList VALUES ('Data14')
INSERT INTO @MyList VALUES ('Data15')
INSERT INTO @MyList VALUES ('Data16')
INSERT INTO @MyList VALUES ('Data17')
INSERT INTO @MyList VALUES ('Data18')
INSERT INTO @MyList VALUES ('Data19')
INSERT INTO @MyList VALUES ('Data20')
INSERT INTO @MyList VALUES ('Data21')
INSERT INTO @MyList VALUES ('Data22')
INSERT INTO @MyList VALUES ('Data23')
INSERT INTO @MyList VALUES ('Data24')
INSERT INTO @MyList VALUES ('Data25')
INSERT INTO @MyList VALUES ('Data26')
INSERT INTO @MyList VALUES ('Data27')
INSERT INTO @MyList VALUES ('Data28')
INSERT INTO @MyList VALUES ('Data29')
INSERT INTO @MyList VALUES ('Data30')
DECLARE @COUNTER INT = 0;
DECLARE @MAX INT = (SELECT COUNT(*) FROM @MyList)
DECLARE @VALUE VARCHAR(50);
WHILE @cnt <= @MAX  
BEGIN
SET @VALUE = (SELECT Value FROM @MyList 
ORDER BY 1 OFFSET @COUNTER 
ROWS FETCH NEXT 1 ROWS ONLY);
PRINT @cnt
PRINT @VALUE
PRINT @COUNTER
IF EXISTS (SELECT * FROM Staff_Manager.dbo.Staff_Count_TBL WHERE Staff_No = 3005 AND Year_D = 2016 AND Month_D = 6 AND Column_Index = @cnt)
BEGIN
UPDATE Staff_Manager.dbo.Staff_Count_TBL 
SET Column_Value = (
SELECT COUNT(*)  
FROM Staff_Manager.dbo.Staff_Time_TBL
WHERE Staff_No = 3005 AND Date_Data BETWEEN '2016/6/1' AND '2016/7/1' AND Info_Data = @value
GROUP BY Staff_No, Info_Data),
Column_Value2 = @value
WHERE Staff_No = 3005 AND Year_D = 2016 AND Month_D = 6 AND Column_Index = @cnt
END
ELSE
BEGIN
INSERT INTO Staff_Manager.dbo.Staff_Count_TBL 
(Staff_No, Year_D, Month_D, Column_Index, Column_Value, Column_Value2)
SELECT 3005, 2016, 6, @cnt, COUNT(*), @value 
FROM Staff_Manager.dbo.Staff_Time_TBL
WHERE Staff_No = 3005 AND Date_Data BETWEEN '2016/6/1' AND '2016/7/1' AND Info_Data = @value 
GROUP BY Staff_No, Info_Data
END
SET @cnt = @cnt + 1
SET @COUNTER = @COUNTER + 1
END
  • Suis-je correct que vous insérez mêmes valeurs huit fois? La seule différence est column_index.
  • Lorsque column_index = 1 puis "Info_Data = Data1` , column_index = 2 puis" Info_Data = 2 " et ainsi de suite à travers la boucle.
  • Eh bien, vous n'avez pas de cet algorithme dans votre code. Est-ce @MyList variable à partir de votre code réel ou de l'obtention de données à insterted en quelque sorte d'autre? S'il l'est, comment allez-vous déterminer quelle ligne de @Maliste appartient à la colonne? Vous n'avez pas ni identity ni col_index colonne dans @MyList de sorte que les valeurs ne sont pas liés à n'importe quelle position.
  • c'est le code actuel, de grossier, il n'est pas de travail. Donc, je devrais ajouter un index d'une certaine sorte de garder une trace de la position?
  • Et après l'ajout que col_index - avoir un autre regard sur votre code. N'est pas cette "boucle" ressemble à une régulière rejoindre? on col_index=col_index, set Column_Value2 = data
InformationsquelleAutor KyloRen | 2016-07-15