日期:2014-05-17  浏览次数:20513 次

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,@val