sql server 有什么办法可以实现语句指定分段执行。

freesky20 2019-02-12 04:38:28
请问有什么办法可以实SQL 多语段指定分段执行。

declare @CompanyCode as nvarchar(4)
set @CompanyCode=('A1','A2','A3') --这里只是演示,实际不能这么赋值。

SELECT * FROM
(select 'A1' as [Company Code],* from server1.dbo.appDB01.AP01A100
UNION ALL
select 'A2' as [Company Code],* from server2.dbo.appDB02.AP01A200
UNION ALL
select 'A3' as [Company Code],* from server3.dbo.appDB03.AP01A300) P
WHERE P.[Company Code] in (@CompanyCode)


上面这段放在报表中没有问题,但是这样带来一个问题就是,如果我只是要查单独的某个公司,语句会将所有涉及的服务器的表都查一遍,速度会非常慢,因为服务器在不同的国家。有什么办法可以让语句只执行我需要查询的公司的哪段代码?


我试过在 case, 但是in操作符只能用在where中。
不知大家有什么好办法。
...全文
661 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
freesky20 2019-02-13
  • 打赏
  • 举报
回复
引用 7 楼 唐诗三百首 的回复:

declare @CompanyCode nvarchar(100)
set @CompanyCode=N'A1,A3'  --> 传入参数需是这样的格式.


declare @tsql nvarchar(max)

select @tsql=case when charindex(N'A1',@CompanyCode)>0 then 
                     N'select ''A1'' as [Company Code],* from server1.dbo.appDB01.AP01A100 union all '
                   else N'' end
             +case when charindex(N'A2',@CompanyCode)>0 then 
                     N'select ''A2'' as [Company Code],* from server2.dbo.appDB02.AP01A200 union all '
                   else N'' end
             +case when charindex(N'A3',@CompanyCode)>0 then 
                     N'select ''A3'' as [Company Code],* from server3.dbo.appDB03.AP01A300 union all '
                   else N'' end
             
select @tsql=left(@tsql,len(@tsql)-9)

exec(@tsql)
谢谢指正。
freesky20 2019-02-13
  • 打赏
  • 举报
回复
引用 5 楼 axiuaxiu369 的回复:
[quote=引用 楼主 freesky20 的回复:] 请问有什么办法可以实SQL 多语段指定分段执行。

declare @CompanyCode as nvarchar(4)
set @CompanyCode=('A1','A2','A3') --这里只是演示,实际不能这么赋值。

SELECT * FROM 
(select 'A1' as [Company Code],* from server1.dbo.appDB01.AP01A100
UNION ALL
select 'A2' as [Company Code],* from server2.dbo.appDB02.AP01A200
UNION ALL
select 'A3' as [Company Code],* from server3.dbo.appDB03.AP01A300) P
WHERE P.[Company Code] in (@CompanyCode)
上面这段放在报表中没有问题,但是这样带来一个问题就是,如果我只是要查单独的某个公司,语句会将所有涉及的服务器的表都查一遍,速度会非常慢,因为服务器在不同的国家。有什么办法可以让语句只执行我需要查询的公司的哪段代码? 我试过在 case, 但是in操作符只能用在where中。 不知大家有什么好办法。
有两个疑问和两个建议。 疑问1:
declare @CompanyCode as nvarchar(4)
set @CompanyCode=('A1','A2','A3') --这里只是演示,实际不能这么赋值。
没看明白这个演示,因为这个赋值的方法,在SQL server中确实演示不通,如果再说具体一点,或许更好一些,就现在这个描述,改造语句如下(至于赋值,您自己想办法),此为建议1:
declare @CompanyCode as nvarchar(4)
set @CompanyCode=('A1','A2','A3') --这里只是演示,实际不能这么赋值。

SELECT * FROM 
(select 'A1' as [Company Code],* from server1.dbo.appDB01.AP01A100 where @CompanyCode = 'A1'
UNION ALL
select 'A2' as [Company Code],* from server2.dbo.appDB02.AP01A200 where @CompanyCode = 'A2'
UNION ALL
select 'A3' as [Company Code],* from server3.dbo.appDB03.AP01A300 where @CompanyCode = 'A3') P
WHERE P.[Company Code] in (@CompanyCode)
疑问2:server3.dbo.appDB03.AP01A300 这个貌似不是正确的写法,或许是 server3.appDB03.dbo.AP01A300 ? 建议2:您的代码效率低下不仅仅是您描述的这个原因,个人觉得还有如下原因:第一,使用了select * from …… 建议用几个字段,就写明白具体的几个字段;第二,查询链接服务器时where后面可以写的更具体,比如时间段等条件;第三,如果有group by 运算,建议也放在远程上执行,执行完了再查询,会大大减少数据传输量,提高查询效率;第四,如果使用拼接语句(EXEC sql语名),建议还是跟临时表和表变量配合使用吧,用起来更加灵活和高效。[/quote] 谢谢指正,我是临时手打的代码,因为不想把公司的细节暴露太多,只是提一个样的思路。你的第二个方法不错,我已经朝着这个方向改了。
freesky20 2019-02-13
  • 打赏
  • 举报
回复
引用 6 楼 victor_yang 的回复:
楼主的意思是,如果查询公司有A1的,就从Server1查数据,有A2的就从Server2查数据,最后合并返回,我建议你将Sql语句变成字符串操作吧,我给你个方法,语句不一定对。 declare @Sql nvarchar(4000) set @Sql='' if 'A1' in @CompanyCode begin if @Sql='' then Set @Sql=@Sql+' select ''A1'' as [Company Code],* from server1.dbo.appDB01.AP01A100 where @CompanyCode = ''A1'' ' else Set @Sql=@Sql+' Union all select ''A1'' as [Company Code],* from server1.dbo.appDB01.AP01A100 where @CompanyCode = ''A1'' ' end if 'A2' in @CompanyCode begin if @Sql='' then Set @Sql=@Sql+' select ''A2'' as [Company Code],* from server2.dbo.appDB02.AP01A200 where @CompanyCode = ''A2'' ' else Set @Sql=@Sql+' Union all select ''A2'' as [Company Code],* from server2.dbo.appDB02.AP01A200 where @CompanyCode = ''A2'' ' end ...... if @Sql<>'' then Exec(@Sql)
是的,是这种思路,我现在正冲这个方向做。
victor_yang 2019-02-13
  • 打赏
  • 举报
回复
用if判断,再拼接语句,这方法可行,我在做用友二开就有用到这方法。
freesky20 2019-02-13
  • 打赏
  • 举报
回复
引用 1 楼 shoppo0505 的回复:
写个if 判断,如果根据输入参数,执行相应的代码
好像 if @cc in (@CompanyCode ) 可以,沿着这个思路就可以拼接语句了。
唐诗三百首 2019-02-13
  • 打赏
  • 举报
回复 1

declare @CompanyCode nvarchar(100)
set @CompanyCode=N'A1,A3' --> 传入参数需是这样的格式.


declare @tsql nvarchar(max)

select @tsql=case when charindex(N'A1',@CompanyCode)>0 then
N'select ''A1'' as [Company Code],* from server1.dbo.appDB01.AP01A100 union all '
else N'' end
+case when charindex(N'A2',@CompanyCode)>0 then
N'select ''A2'' as [Company Code],* from server2.dbo.appDB02.AP01A200 union all '
else N'' end
+case when charindex(N'A3',@CompanyCode)>0 then
N'select ''A3'' as [Company Code],* from server3.dbo.appDB03.AP01A300 union all '
else N'' end

select @tsql=left(@tsql,len(@tsql)-9)

exec(@tsql)
victor_yang 2019-02-13
  • 打赏
  • 举报
回复 1
楼主的意思是,如果查询公司有A1的,就从Server1查数据,有A2的就从Server2查数据,最后合并返回,我建议你将Sql语句变成字符串操作吧,我给你个方法,语句不一定对。

declare @Sql nvarchar(4000)
set @Sql=''

if 'A1' in @CompanyCode
begin
if @Sql='' then
Set @Sql=@Sql+' select ''A1'' as [Company Code],* from server1.dbo.appDB01.AP01A100 where @CompanyCode = ''A1'' '
else
Set @Sql=@Sql+' Union all select ''A1'' as [Company Code],* from server1.dbo.appDB01.AP01A100 where @CompanyCode = ''A1'' '
end

if 'A2' in @CompanyCode
begin
if @Sql='' then
Set @Sql=@Sql+' select ''A2'' as [Company Code],* from server2.dbo.appDB02.AP01A200 where @CompanyCode = ''A2'' '
else
Set @Sql=@Sql+' Union all select ''A2'' as [Company Code],* from server2.dbo.appDB02.AP01A200 where @CompanyCode = ''A2'' '
end
......

if @Sql<>'' then
Exec(@Sql)
阿·修 2019-02-13
  • 打赏
  • 举报
回复
引用 楼主 freesky20 的回复:
请问有什么办法可以实SQL 多语段指定分段执行。

declare @CompanyCode as nvarchar(4)
set @CompanyCode=('A1','A2','A3') --这里只是演示,实际不能这么赋值。

SELECT * FROM 
(select 'A1' as [Company Code],* from server1.dbo.appDB01.AP01A100
UNION ALL
select 'A2' as [Company Code],* from server2.dbo.appDB02.AP01A200
UNION ALL
select 'A3' as [Company Code],* from server3.dbo.appDB03.AP01A300) P
WHERE P.[Company Code] in (@CompanyCode)
上面这段放在报表中没有问题,但是这样带来一个问题就是,如果我只是要查单独的某个公司,语句会将所有涉及的服务器的表都查一遍,速度会非常慢,因为服务器在不同的国家。有什么办法可以让语句只执行我需要查询的公司的哪段代码? 我试过在 case, 但是in操作符只能用在where中。 不知大家有什么好办法。
有两个疑问和两个建议。 疑问1:
declare @CompanyCode as nvarchar(4)
set @CompanyCode=('A1','A2','A3') --这里只是演示,实际不能这么赋值。
没看明白这个演示,因为这个赋值的方法,在SQL server中确实演示不通,如果再说具体一点,或许更好一些,就现在这个描述,改造语句如下(至于赋值,您自己想办法),此为建议1:
declare @CompanyCode as nvarchar(4)
set @CompanyCode=('A1','A2','A3') --这里只是演示,实际不能这么赋值。

SELECT * FROM 
(select 'A1' as [Company Code],* from server1.dbo.appDB01.AP01A100 where @CompanyCode = 'A1'
UNION ALL
select 'A2' as [Company Code],* from server2.dbo.appDB02.AP01A200 where @CompanyCode = 'A2'
UNION ALL
select 'A3' as [Company Code],* from server3.dbo.appDB03.AP01A300 where @CompanyCode = 'A3') P
WHERE P.[Company Code] in (@CompanyCode)
疑问2:server3.dbo.appDB03.AP01A300 这个貌似不是正确的写法,或许是 server3.appDB03.dbo.AP01A300 ? 建议2:您的代码效率低下不仅仅是您描述的这个原因,个人觉得还有如下原因:第一,使用了select * from …… 建议用几个字段,就写明白具体的几个字段;第二,查询链接服务器时where后面可以写的更具体,比如时间段等条件;第三,如果有group by 运算,建议也放在远程上执行,执行完了再查询,会大大减少数据传输量,提高查询效率;第四,如果使用拼接语句(EXEC sql语名),建议还是跟临时表和表变量配合使用吧,用起来更加灵活和高效。
freesky20 2019-02-12
  • 打赏
  • 举报
回复
不知道有没有人可以有办法写出EXEC sql语名。可以分另把select 'A1' as [Company Code],* from server1.dbo.appDB01.AP01A100 赋值给sql1,sql2, sql3 @sql1='select ''A1'' as [Company Code],* from server1.dbo.appDB01.AP01A100 ' @sql2='select ''A2'' as [Company Code],* from server2.dbo.appDB02.AP01A200 ' @sql3='select ''A3'' as [Company Code],* from server3.dbo.appDB03.AP01A300 ' 最后拼接语句段。 有没有人有好的想法。
freesky20 2019-02-12
  • 打赏
  • 举报
回复
实际是我的语句是可以满足我的要求的, 我现在的目的是想对我的语句进行优化,我的意思是,当用户选择查询A1,或A2,或A1加A2, 不会同时把 select 'A1' as [Company Code],* from server1.dbo.appDB01.AP01A100 select 'A2' as [Company Code],* from server2.dbo.appDB02.AP01A200 select 'A3' as [Company Code],* from server3.dbo.appDB03.AP01A300 都执行一遍。而是查询A1的时候只执行 select 'A1' as [Company Code],* from server1.dbo.appDB01.AP01A100 而是查询A2的时候只执行 select 'A2' as [Company Code],* from server2.dbo.appDB02.AP01A200 查询 A1 A2 或A2,A3的时候只执行 select 'A1' as [Company Code],* from server1.dbo.appDB01.AP01A100 union all select 'A2' as [Company Code],* from server2.dbo.appDB02.AP01A200 或者 select 'A2' as [Company Code],* from server2.dbo.appDB02.AP01A200 union all select 'A3' as [Company Code],* from server3.dbo.appDB03.AP01A300
freesky20 2019-02-12
  • 打赏
  • 举报
回复
引用 1 楼 shoppo0505 的回复:
写个if 判断,如果根据输入参数,执行相应的代码
MSSQL 在语句中不支持 if把? 我用:

select if(true,1+1,1+2);
只有 mysql才执行,mssql在存储过程中可以使用,但那就要定义存储过程在远程数据库中了,可以我没有DBA权限,只有一个查询功能。
shoppo0505 2019-02-12
  • 打赏
  • 举报
回复
写个if 判断,如果根据输入参数,执行相应的代码

34,874

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧