在with和inside情况下使用参数设置查询

时间:2018-10-15 05:28:43

标签: sql sql-server

我想对所有存在的数据库进行查询,但不太确定语法,但是我得到了

  

第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

2 个答案:

答案 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 ('')

然后执行查询