当前位置: 代码迷 >> Sql Server >> sql语句连接有关问题
  详细解决方案

sql语句连接有关问题

热度:72   发布时间:2016-04-24 18:55:17.0
sql语句连接问题
需要如下的效果:

select * from EA01_1978
union
exec zjsj '10901'

上面的存储过程返回的数据,字段和上面的查询相同,上面一条sql是在程序中固定的语句,我无法修改,但是我可以在后面写sql语句,通过union将语句连接 因为在用unoin的时候只支持select语句,所以我建立一个存储过程用来获取该表的字段,拼接sql语句,使其字段和上面的相同,但现在又出现问题,存储过程如何和语句通过union连接? 注意前提是select * from a此条不可修改,可以在后面追加条件

程序里面只支持union后面加语句达到我要的效果,程序属于第三方开发,无源码,无法修改

所用数据库是sql 2008 r2

存储过程代码


alter proc zjsj  --存储过程
@content varchar(30) --接收部门编号
as
declare @sql varchar(2000) --存储拼接的sql语句
declare @name1 varchar(2000)--接收拼接的字段
declare Test_Cursor Cursor scroll for --创建游标
select   name from   syscolumns   where   id=object_id(N'a')
open Test_Cursor
declare @name varchar(1000)
fetch next from Test_Cursor into @name
set @name1 = @name
while @@fetch_status = 0
begin
fetch next from Test_Cursor into @name
set @name1 = @name1 + ',' + @name --通过游标和循环将所有字段查询拼接出来
end 
set @sql = 'select ' + @name1 + ' from b'
close Test_Cursor
deallocate Test_Cursor
if(@content like '109%')--根据部门拼接相应条件
begin
set @sql = @sql + ' where dept_code not like ''109%'' and (a01 like ''%在职%'' or a01 = ''试用人员'')'
end
else if (@content not like '109%')
begin
set @sql = @sql + ' where dept_code not like ''1%'''
end
exec (@sql)
go

------解决方案--------------------
试试这个:

if OBJECT_ID('tempdb..#temp') is not null
  drop table #temp

select * into #temp
frm EA01_1978
where 1=0

insert into #temp
exec zjsj '10901'

select * from EA01_1978
union
select * from #temp

------解决方案--------------------
打击一下,我觉得你这个情况下没办法了。除非你重新开发
------解决方案--------------------
不懂 帮你顶一下
------解决方案--------------------
你在程序里面分两次获取数据不就可以了吗,然后程序里面可以再进行datatable的拼接
------解决方案--------------------
问题就是即使你知道怎么改,你又改不了源代码
------解决方案--------------------
引用:
Quote: 引用:

打击一下,我觉得你这个情况下没办法了。除非你重新开发

么源代码啊!只能从sql上下手


现在的问题是什么,你不能修改:

select * from EA01_1978
union
exec zjsj '10901'

那怎么实现你的需求呢,存储过程的结果,是不能直接union的呢
------解决方案--------------------
用函数不行吗?

建一个函数,返回数据集的字段与表 EA01_1978 完全相同就可以了啊。

例:函数ListToInt

ALTER function [dbo].[ListToInt](@values nvarchar(MAX), @delimiter nvarchar(10))
returns @result table (value int)
as
begin
declare @v as nvarchar(MAX);
while charindex(@delimiter,@values) <> 0
begin
  set @v = substring(@values,1,charindex(@delimiter,@values)-1);
  if isnumeric(@v)=1
  insert into @result
  values(@v);
  set @values = substring(@values,charindex(@delimiter,@values)+1,len(@values));
end

if isnumeric(@values)=1
insert into @result
  values(@values);
return;
end


应用:

declare @tmp table
(
  value int
  )

insert into @tmp values (10);

select * from @tmp
union
select * from ListToInt('1,2,3',',') 



返回:

1 row(s) affected)
value
-----------
1
2
3
10

(4 row(s) affected)

------解决方案--------------------
引用:
Quote: 引用:

问题就是即使你知道怎么改,你又改不了源代码


是啊,要是能改源代码,我直接就一个sql语句搞定啦,何必还这么麻烦了
现在都没辙啦


不是,我先不太明白。

是哪些能修改,哪些不能修改?

------解决方案--------------------
那你现在要修改的是exec那部分?因为这样的话union all基本上是少不了了
------解决方案--------------------
邪恶的CSDN,引用又没提醒....
------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

问题就是即使你知道怎么改,你又改不了源代码


是啊,要是能改源代码,我直接就一个sql语句搞定啦,何必还这么麻烦了
现在都没辙啦


不是,我先不太明白。

是哪些能修改,哪些不能修改?

哦,是select * from EA01_1978这个不能修改,而且必定是在第一行


你的意思是只能修改后面的union exec xxx 这个?
  相关解决方案