2016-01-12 3 views
-1

Chaque magasin possède sa propre base de données (ce que je reconnais comme étant une mauvaise pratique), et j'ai besoin d'obtenir des données de toutes ces bases de données qui répondent à certains critères. Je suis venu avec cela, à ce jour, mais je reçois une erreur deLe SQL dynamique est-il le seul moyen de l'exécuter?

Msg 102, niveau 15, état 1, ligne 81
syntaxe incorrecte près «) ».

Je pense que cela montrera ce que je dois réaliser, le SQL dynamique est-il le meilleur moyen d'effectuer cette tâche? Si oui, que puis-je faire pour supprimer mon erreur? Si ce n'est pas le cas, quelles idées/réflexions/réécrit les utilisateurs SQL les plus avancés peuvent-ils fournir?

Create Table #storeinformation 
(
    storeID int IDENTITY(1,1) PRIMARY KEY 
    ,storename varchar(150) 
    ,storetype varchar(150) 
) 
Insert INTO #storeinformation Values ('A', 'Corner'), ('B', 'Strip Mall'), ('C', 'Corner'), ('D', 'Corner') 
Create Table #storeA 
(
    storeID varchar(100) 
    ,employeeid int 
    ,tobaccosales decimal(16,4) 
    ,foodsales decimal(16,4) 
    ,lotterysales decimal(16,4) 
    ,gsmapproval varchar(10) 
    ,BDSMapproval varchar(10) 
    ,RSMapproval varchar(10) 
) 
Insert INTO #storeA VALUES ('A', 16, '14.23', '18.36', '18.22', NULL, NULL, NULL),('A', 43, '110.23', '181.36', '183.22', NULL, NULL, NULL),('A', 55, '124.23', '182.36', '183.22', 'Yes', 'Yes', 'Yes') 
Create Table #storeB 
(
    storeID varchar(100) 
    ,employeeid int 
    ,tobaccosales decimal(16,4) 
    ,foodsales decimal(16,4) 
    ,lotterysales decimal(16,4) 
    ,gsmapproval varchar(10) 
    ,BDSMapproval varchar(10) 
    ,RSMapproval varchar(10) 
) 
Insert INTO #storeB VALUES ('B', 11, '14.23', '18.36', '18.22', 'Yes', NULL, NULL),('B', 13, '110.23', '181.36', '183.22', NULL, NULL, NULL),('B', 52, '124.23', '182.36', '183.22', NULL, 'Yes', NULL) 
Create Table #storeC 
(
    storeID varchar(100) 
    ,employeeid int 
    ,tobaccosales decimal(16,4) 
    ,foodsales decimal(16,4) 
    ,lotterysales decimal(16,4) 
    ,gsmapproval varchar(10) 
    ,BDSMapproval varchar(10) 
    ,RSMapproval varchar(10) 
) 
Insert INTO #storeC VALUES ('C', 6, '14.23', '18.36', '18.22', NULL, NULL, 'Yes'),('C', 4, '110.23', '181.36', '183.22', NULL, NULL, NULL),('C', 5, '124.23', '182.36', '183.22', NULL, 'Yes', NULL) 
Create Table #storeD 
(
    storeID varchar(100) 
    ,employeeid int 
    ,tobaccosales decimal(16,4) 
    ,foodsales decimal(16,4) 
    ,lotterysales decimal(16,4) 
    ,gsmapproval varchar(10) 
    ,BDSMapproval varchar(10) 
    ,RSMapproval varchar(10) 
) 
Insert INTO #storeD VALUES ('D', '116', '14.23', '18.36', '18.22', 'Yes', 'Yes', 'Yes'),('D', '143', '10.23', '81.36', '18.22', 'Yes', NULL, 'Yes'),('D', '155', '12.23', '1.36', '183.22', 'Yes', NULL, NULL) 

Create Table #FullOnFrontalData 
(
    storename varchar(100) 
    ,tobaccosales decimal(16,4) 
    ,foodsales decimal(16,4) 
    ,lotterysales decimal(16,4) 
    ,evaluated varchar(10) 
) 

Insert Into #FullOnFrontalData (storename) 
Select storename 
FROM #storeinformation 
Where storetype = 'Corner' 

Declare @storecount int, @dbname varchar(100) 

Set @storecount = (Select Count(*) from #FullOnFrontalData) 

while @storecount > 0 
BEGIN 

    Set @dbname = (Select Top 1 storename from #FullOnFrontalData where evaluated is null) 

    EXEC('Update #FullOnFrontalData 
      Set tobaccosales = (Select SUM(tobaccosales) FROM '[email protected])) 
    EXEC('Update #FullOnFrontalData 
     foodsales = (Select SUM(foodsales) FROM '[email protected])) 
    EXEC('Update #FullOnFrontalData 
      lotterysales = (Select SUM(lotterysales) FROM '[email protected])) 

    update #FullOnFrontalData 
    set evaluated = 1 
    where storename = @dbname    

    set @storecount = @storecount - 1 

END 

Select * from #FullOnFrontalData 
+0

Vous avez en sus) à la fin. Il devrait être '+ @dbname + ')')' Faites aussi votre @dbname nvarchar. – artm

+0

@artm - bonne prise. Recommanderiez-vous que ce soit un cas d'utiliser inline sqql? –

Répondre

0

Au lieu de while etc., vous pouvez simplement le faire avec une instruction de mise à jour.

insert into #FullOnFrontalData 
    select Sinf.storeid, tab, fod, lott, 1 from (
    select storeid, sum(tobaccosales) tab , sum(foodsales) fod, sum(lotterysales) lott 
    from #storeA 
    group by storeid 
    union all 
     select storeid, sum(tobaccosales) , sum(foodsales), sum(lotterysales) 
    from #storeB 
     group by storeid 
     union all 
     select storeid, sum(tobaccosales) , sum(foodsales), sum(lotterysales) 
    from #storeC 
     group by storeid 
     union all 
     select storeid, sum(tobaccosales) , sum(foodsales), sum(lotterysales) 
    from #storeD 
     group by storeid) SInv 
     join #storeinformation SInf 
     on Sinv.storeid = Sinf.storename and 
     Sinf.storetype = 'Corner' 

La version complète est ci-dessous:

Create Table #storeinformation 
(
    storeID int IDENTITY(1,1) PRIMARY KEY 
    ,storename varchar(150) 
    ,storetype varchar(150) 
) 
Insert INTO #storeinformation Values ('A', 'Corner'), ('B', 'Strip Mall'), ('C', 'Corner'), ('D', 'Corner') 
Create Table #storeA 
(
    storeID varchar(100) 
    ,employeeid int 
    ,tobaccosales decimal(16,4) 
    ,foodsales decimal(16,4) 
    ,lotterysales decimal(16,4) 
    ,gsmapproval varchar(10) 
    ,BDSMapproval varchar(10) 
    ,RSMapproval varchar(10) 
) 
Insert INTO #storeA VALUES ('A', 16, '14.23', '18.36', '18.22', NULL, NULL, NULL),('A', 43, '110.23', '181.36', '183.22', NULL, NULL, NULL),('A', 55, '124.23', '182.36', '183.22', 'Yes', 'Yes', 'Yes') 
Create Table #storeB 
(
    storeID varchar(100) 
    ,employeeid int 
    ,tobaccosales decimal(16,4) 
    ,foodsales decimal(16,4) 
    ,lotterysales decimal(16,4) 
    ,gsmapproval varchar(10) 
    ,BDSMapproval varchar(10) 
    ,RSMapproval varchar(10) 
) 
Insert INTO #storeB VALUES ('B', 11, '14.23', '18.36', '18.22', 'Yes', NULL, NULL),('B', 13, '110.23', '181.36', '183.22', NULL, NULL, NULL),('B', 52, '124.23', '182.36', '183.22', NULL, 'Yes', NULL) 
Create Table #storeC 
(
    storeID varchar(100) 
    ,employeeid int 
    ,tobaccosales decimal(16,4) 
    ,foodsales decimal(16,4) 
    ,lotterysales decimal(16,4) 
    ,gsmapproval varchar(10) 
    ,BDSMapproval varchar(10) 
    ,RSMapproval varchar(10) 
) 
Insert INTO #storeC VALUES ('C', 6, '14.23', '18.36', '18.22', NULL, NULL, 'Yes'),('C', 4, '110.23', '181.36', '183.22', NULL, NULL, NULL),('C', 5, '124.23', '182.36', '183.22', NULL, 'Yes', NULL) 
Create Table #storeD 
(
    storeID varchar(100) 
    ,employeeid int 
    ,tobaccosales decimal(16,4) 
    ,foodsales decimal(16,4) 
    ,lotterysales decimal(16,4) 
    ,gsmapproval varchar(10) 
    ,BDSMapproval varchar(10) 
    ,RSMapproval varchar(10) 
) 
Insert INTO #storeD VALUES ('D', '116', '14.23', '18.36', '18.22', 'Yes', 'Yes', 'Yes'),('D', '143', '10.23', '81.36', '18.22', 'Yes', NULL, 'Yes'),('D', '155', '12.23', '1.36', '183.22', 'Yes', NULL, NULL) 

Create Table #FullOnFrontalData 
(
    storename varchar(100) 
    ,tobaccosales decimal(16,4) 
    ,foodsales decimal(16,4) 
    ,lotterysales decimal(16,4) 
    ,evaluated varchar(10) 
) 


insert into #FullOnFrontalData 
select Sinf.storeid, tab, fod, lott, 1 from (
select storeid, sum(tobaccosales) tab , sum(foodsales) fod, sum(lotterysales) lott 
from #storeA 
group by storeid 
union all 
    select storeid, sum(tobaccosales) , sum(foodsales), sum(lotterysales) 
from #storeB 
    group by storeid 
    union all 
    select storeid, sum(tobaccosales) , sum(foodsales), sum(lotterysales) 
from #storeC 
    group by storeid 
    union all 
    select storeid, sum(tobaccosales) , sum(foodsales), sum(lotterysales) 
from #storeD 
    group by storeid) SInv 
    join #storeinformation SInf 
    on Sinv.storeid = Sinf.storename and 
    Sinf.storetype = 'Corner'