当前位置: 代码迷 >> Sql Server >> mssql 中 如其让表 接受两个数据集
  详细解决方案

mssql 中 如其让表 接受两个数据集

热度:542   发布时间:2016-04-24 09:40:00.0
mssql 中 如果让表 接受两个数据集
exec sp_spaceused 
执行这个 系统存储过程后  默认返回两个数据集 
先在想把 这两个数据集 放在表a  表B中 

求 解????
------解决思路----------------------
IF OBJECT_ID('tempdb..#t') IS NOT NULL
    DROP TABLE #t
GO
SELECT * 
INTO #t
FROM OPENROWSET('SQLNCLI','server=127.0.0.1\SQLSERVER2005;Trusted_Connection=yes','EXEC(''USE 数据库; EXEC sp_spaceused'')')
SELECT * FROM #t
只试出获取第一个表的方法
第二个表,再试试
期待楼下高见
------解决思路----------------------
本帖最后由 DBA_Huangzj 于 2014-11-25 11:06:57 编辑
CREATE PROCEDURE proc_spaceused
-- Add the parameters for the stored procedure here
@objname nvarchar(776) = null, -- The object we want size on.
@updateusage varchar(5) = false -- Param. for specifying that
-- usage info. should be updated.
as

declare @id int -- The object id that takes up space
,@type character(2) -- The object type.
,@pages bigint -- Working variable for size calc.
,@dbname sysname
,@dbsize bigint
,@logsize bigint
,@reservedpages  bigint
,@usedpages  bigint
,@rowCount bigint

/*
**  Check to see if user wants usages updated.
*/

if @updateusage is not null
begin
select @updateusage=lower(@updateusage)

if @updateusage not in ('true','false')
begin
raiserror(15143,-1,-1,@updateusage)
return(1)
end
end
/*
**  Check to see that the objname is local.
*/
if @objname IS NOT NULL
begin

select @dbname = parsename(@objname, 3)

if @dbname is not null and @dbname <> db_name()
begin
raiserror(15250,-1,-1)
return (1)
end

if @dbname is null
select @dbname = db_name()

/*
**  Try to find the object.
*/
SELECT @id = object_id, @type = type FROM sys.objects WHERE object_id = object_id(@objname)

-- Translate @id to internal-table for queue
IF @type = 'SQ'
SELECT @id = object_id FROM sys.internal_tables WHERE parent_id = @id and internal_type = 201 --ITT_ServiceQueue

/*
**  Does the object exist?
*/
if @id is null
begin
raiserror(15009,-1,-1,@objname,@dbname)
return (1)
end

-- Is it a table, view or queue?
IF @type NOT IN ('U ','S ','V ','SQ','IT')
begin
raiserror(15234,-1,-1)
return (1)
end
end 

/*
**  Update usages if user specified to do so.
*/

if @updateusage = 'true'
begin
if @objname is null
dbcc updateusage(0) with no_infomsgs
else
dbcc updateusage(0,@objname) with no_infomsgs
print ' '
end

set nocount on

/*
**  If @id is null, then we want summary data.
*/
if @id is null
begin
select @dbsize = sum(convert(bigint,case when status & 64 = 0 then size else 0 end))
, @logsize = sum(convert(bigint,case when status & 64 <> 0 then size else 0 end))
from dbo.sysfiles

select @reservedpages = sum(a.total_pages),
@usedpages = sum(a.used_pages),
@pages = sum(
CASE
-- XML-Index and FT-Index internal tables are not considered "data", but is part of "index_size"
When it.internal_type IN (202,204,211,212,213,214,215,216) Then 0
When a.type <> 1 Then a.used_pages
When p.index_id < 2 Then a.data_pages
Else 0
END
)
from sys.partitions p join sys.allocation_units a on p.partition_id = a.container_id
left join sys.internal_tables it on p.object_id = it.object_id

/* unallocated space could not be negative */
select 
database_name = db_name(),
database_size = convert (dec (15,0),((convert (dec (15,2),@dbsize) + convert (dec (15,2),@logsize)) 
* 8192 / 1024)),
'unallocated space' = convert (dec (15,0),(case when @dbsize >= @reservedpages then
(convert (dec (15,2),@dbsize) - convert (dec (15,2),@reservedpages)) 
* 8192 / 1024 else 0 end))

/*
**  Now calculate the summary data.
**  reserved: sum(reserved) where indid in (0, 1, 255)
** data: sum(data_pages) + sum(text_used)
** index: sum(used) where indid in (0, 1, 255) - data
** unused: sum(reserved) - sum(used) where indid in (0, 1, 255)
*/
,--select
reserved = convert (dec (15,0),(@reservedpages * 8192 / 1024)),
data = convert (dec (15,0),(@pages * 8192 / 1024) ),
index_size = convert (dec (15,0),((@usedpages - @pages) * 8192 / 1024.)),
unused = convert (dec (15,0),((@reservedpages - @usedpages) * 8192 / 1024)),
unit = 'KB'
end

/*
**  We want a particular object.
*/
else
begin
/*
** Now calculate the summary data. 
*  Note that LOB Data and Row-overflow Data are counted as Data Pages.
*/
SELECT 
@reservedpages = SUM (reserved_page_count),
@usedpages = SUM (used_page_count),
@pages = SUM (
CASE
WHEN (index_id < 2) THEN (in_row_data_page_count + lob_used_page_count + row_overflow_used_page_count)
ELSE lob_used_page_count + row_overflow_used_page_count
END
),
@rowCount = SUM (
CASE
WHEN (index_id < 2) THEN row_count
ELSE 0
END
)
FROM sys.dm_db_partition_stats
WHERE object_id = @id;

/*
** Check if table has XML Indexes or Fulltext Indexes which use internal tables tied to this table
*/
IF (SELECT count(*) FROM sys.internal_tables WHERE parent_id = @id AND internal_type IN (202,204,211,212,213,214,215,216)) > 0 
BEGIN
/*
**  Now calculate the summary data. Row counts in these internal tables don't 
**  contribute towards row count of original table.
*/
SELECT 
@reservedpages = @reservedpages + sum(reserved_page_count),
@usedpages = @usedpages + sum(used_page_count)
FROM sys.dm_db_partition_stats p, sys.internal_tables it
WHERE it.parent_id = @id AND it.internal_type IN (202,204,211,212,213,214,215,216) AND p.object_id = it.object_id;
END

SELECT 
name = OBJECT_NAME (@id),
rows = convert (char(11), @rowCount),
reserved = convert (dec (15,0), (@reservedpages * 8) ),
data =convert (dec (15,0),(@pages * 8)),
index_size = convert (dec (15,0),((CASE WHEN @usedpages > @pages THEN (@usedpages - @pages) ELSE 0 END) * 8)),
unused = convert (dec (15,0), ((CASE WHEN @reservedpages > @usedpages THEN (@reservedpages - @usedpages) ELSE 0 END) * 8) ),
unit = 'KB'


end
Print 'Microsoft sucks'

return (0) -- sp_spaceused

GO

------解决思路----------------------
程序可以利用ado,分别取得2个记录集
------解决思路----------------------
create proc p_test @newid varchar(200) as
if OBJECT_ID('table_'+@newid) is not null
begin
  exec ('drop table table_'+@newid)
end
exec('select ''a'' as a into table_'+@newid)
if OBJECT_ID('temp_'+@newid) is not null
begin
  exec ('drop table temp_'+@newid)
end
exec('select ''b'' as b into temp_'+@newid)

----下面是执行过程写数据
declare @newid varchar(200)
set @newid=abs(checksum(NEWID()))
--select @newid
exec p_test @newid

create table #a (a varchar(20))
create table #b (b varchar(20))
exec ('insert into #a select a from table_'+@newid)
exec ('insert into #b select b from temp_'+@newid)
exec ('drop table table_'+@newid)
exec ('drop table temp_'+@newid)

select * from #a
select * from #b

----
1987314193


a




b
  相关解决方案