我想对所有存在的数据库进行查询,但不太确定语法,但是我得到了
第156条消息,第15级,状态1,第24行 关键字“ set”附近的语法不正确。
有什么想法吗?
declare @query varchar(max);
set @query = '';
with getAllAccount as(
select B.ID,B.DisplayName from (
select ID,DisplayName from u3_system.[dbo].[Account] with (nolock)
where ID = '8c76ef27-3080-4daa-881b-08cd2a1a558f' or ParentID = '8c76ef27-3080-4daa-881b-08cd2a1a558f') A
join u3_system.[dbo].[Account] B with (nolock)
on A.ID = B.ParentID
union
select ID,DisplayName from u3_system.[dbo].[Account] with (nolock)
where ID = '8c76ef27-3080-4daa-881b-08cd2a1a558f'
),
getAllSurveys as(
select s.ID,getAllAccount.DisplayName AccountName, s.DisplayName SurveyName,s.Status,s.LastModified from u3_survey.dbo.survey s with(nolock)
inner join getAllAccount
on S.AccountID = getAllAccount.ID
)
--select * from getAllSurveys
--order by LastModified desc
set @query += case when exists (select * from sys.tables where name = 'LiveResponse_' + replace(getAllAccount.ID,'-',''))
Then 'Select ID,SurveyID from u3_data.data.LiveResponse_' + replace(getAllAccount.ID,'-','') + ' with(nolock) union ' End
from getAllAccount
select @query
答案 0 :(得分:0)
请注意,此sql语句揭示了数据库设计中的一个有意义的缺陷-您有多个存储相同类型实体的表-u3_data.data.LiveResponse_XXX
表。
这种糟糕的设计使您陷入当前的问题,并保证将来会引起更多的问题。
我强烈建议您更改此设计-如此简单,您会感到惊讶:您需要做的就是拥有一个表u3_data.data.LiveResponse
,并添加一列来存储AccountID
。
与您当前的数据库设计相比,这有几个好处:
最重要的一点-您可以在LiveResponse
表和Account
表之间添加外键约束,从而确保引用完整性。
即使这是唯一的好处,仍然是更改数据库设计的足够充分的理由。
第二个-您无需费心构建动态SQL语句即可与LiveResponse
表进行交互-使您作为开发人员的生活更加轻松,代码更加简洁,并有潜在的危险,例如SQL注入攻击要小得多。
同样,仅此一项就足以改变数据库设计。
第三-将单个实体的所有数据分布在多个表上会导致巨大的性能问题。将其保存在单个表中可能会导致该表增长,但是专业数据库可以处理具有数百万行的表。我个人正在使用一个数据库,其中某些表的行数超过1亿行,从SQL Server的角度来看,这并不是一个巨大的数据库。
所有这些,如果您无法更改数据库结构(并且由于您有充分的理由进行更改,那么在您确实无法更改的情况下),要直接回答您的问题,您需要使用select
而不是Jacek在评论中写道的set
。
答案 1 :(得分:0)
Select ' ' + execQuery from
(select * from
(select case when exists (select * from sys.tables where name = 'LiveResponse_' + replace(getAllAccount.ID,'-',''))
Then 'Select SurveyID,Max(CompleteDate) CompleteDate from u3_data.data.LiveResponse_' + replace(getAllAccount.ID,'-','') + ' with(nolock) group by SurveyID union ' End execQuery
from getAllAccount
) A
where execQuery is not null ) B
For xml path ('')
然后执行查询