Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 动态SQL是运行此功能的唯一方法吗?_Sql Server 2008_Tsql_Inline Code - Fatal编程技术网

Sql server 2008 动态SQL是运行此功能的唯一方法吗?

Sql server 2008 动态SQL是运行此功能的唯一方法吗?,sql-server-2008,tsql,inline-code,Sql Server 2008,Tsql,Inline Code,每个商店都有自己的数据库(我同意这是一个糟糕的做法),我需要从所有满足特定标准的数据库中获取数据。到目前为止,我已经提出了这一点,但我得到了一个错误 味精102,第15级,状态1,第81行 “')附近的语法不正确 我认为这将说明我需要实现什么,动态SQL是执行此任务的最佳方式吗?如果是这样,我该如何删除我的错误。如果没有,高级SQL用户可以提供哪些想法/想法/重写 Create Table #storeinformation ( storeID int IDENTITY(1,1) PRI

每个商店都有自己的数据库(我同意这是一个糟糕的做法),我需要从所有满足特定标准的数据库中获取数据。到目前为止,我已经提出了这一点,但我得到了一个错误

味精102,第15级,状态1,第81行
“')附近的语法不正确

我认为这将说明我需要实现什么,动态SQL是执行此任务的最佳方式吗?如果是这样,我该如何删除我的错误。如果没有,高级SQL用户可以提供哪些想法/想法/重写

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 '+@dbname))
    EXEC('Update #FullOnFrontalData
         foodsales = (Select SUM(foodsales) FROM '+@dbname))
    EXEC('Update #FullOnFrontalData
          lotterysales = (Select SUM(lotterysales) FROM '+@dbname))

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

    set @storecount = @storecount - 1

END

Select * from #FullOnFrontalData

而不是while等。只需一条update语句即可

 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'
全文如下:

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'

你有额外的)在最后。它应该是
+@dbname+)”)
也可以让你的@dbname成为nvarchar@artm-很好的捕获。您是否建议使用内联sqql?