TRACEYMARY
asked on
Capture two variables
Hi i have the follwoing that returns
two columns
Im trying to capture these as two variables rather than output
declare @l_db_name varchar(50)
SET @l_db_name = 'TESTTC'
set @retType = N'@cnt varchar(20) OUTPUT'
set @retType = N'@cnt varchar(20) OUTPUT'
set @cmd = N'select ceiling((size * 8192)/(1024.0 * 1024.0)), case when status & 0x100000 = 0 then
@CNT = convert(varchar,ceiling((g rowth * 8192)/(1024.0*1024.0))) + '' MB''' + char(10)+char(13)
+ 'else @CNT = convert (varchar, growth) + '' Percent''' + char(10)+char(13)
+ 'end' + char(10)+char(13)
+ 'from ' + @l_db_name + '.dbo.sysfiles'
set @retType = N'@cnt varchar(20) OUTPUT'
exec sp_executesql @cmd, @retType OUTPUT
--, @retVal OUTPUT
two columns
Im trying to capture these as two variables rather than output
declare @l_db_name varchar(50)
SET @l_db_name = 'TESTTC'
set @retType = N'@cnt varchar(20) OUTPUT'
set @retType = N'@cnt varchar(20) OUTPUT'
set @cmd = N'select ceiling((size * 8192)/(1024.0 * 1024.0)), case when status & 0x100000 = 0 then
@CNT = convert(varchar,ceiling((g
+ 'else @CNT = convert (varchar, growth) + '' Percent''' + char(10)+char(13)
+ 'end' + char(10)+char(13)
+ 'from ' + @l_db_name + '.dbo.sysfiles'
set @retType = N'@cnt varchar(20) OUTPUT'
exec sp_executesql @cmd, @retType OUTPUT
--, @retVal OUTPUT
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
You little stars.....
I was also going to give up and write to tables then come back again get results then do calculations...that would have taken me all day..
Im ...still on my database usage analysis...this is the final steps...phew ...3 weeks later lol.
Cheers
I was also going to give up and write to tables then come back again get results then do calculations...that would have taken me all day..
Im ...still on my database usage analysis...this is the final steps...phew ...3 weeks later lol.
Cheers
ASKER
Hey i tried to just capture the results in the end to a table.
--EXEC SYSTEMADM.sp_DBInfo
CREATE TABLE [DBINFO] (
[ROWID] [int] IDENTITY (1, 1) NOT NULL ,
[SERVERNAME] [nvarchar] (50) COLLATE SQL_Latin1_General_CP1_CI_ AS NULL ,
[DBNAME] [nvarchar] (50) COLLATE SQL_Latin1_General_CP1_CI_ AS NULL ,
[DATA_NAME] [nvarchar] (100) COLLATE SQL_Latin1_General_CP1_CI_ AS NULL ,
[LOG_NAME] [nvarchar] (100) COLLATE SQL_Latin1_General_CP1_CI_ AS NULL ,
[DATA_FILENAME] [nvarchar] (100) COLLATE SQL_Latin1_General_CP1_CI_ AS NULL ,
[LOG_FILENAME] [nvarchar] (100) COLLATE SQL_Latin1_General_CP1_CI_ AS NULL ,
[DATA_GROWTH] [int] NULL ,
[LOG_GROWTH] [int] NULL ,
[CREATED_DATE] [datetime] NULL CONSTRAINT [DF_DSTATS_INFO_CREATED_DA TE] DEFAULT (getdate()),
[DATA_SIZE_PAGES] [int] NULL ,
[LOG_SIZE_PAGES] [int] NULL ,
[DATA_GROWTH_STATUS] [int] NULL ,
[LOG_GROWTH_STATUS] [int] NULL
) ON [PRIMARY]
GO
ALTER procedure SYSTEMADM.sp_DBInfo
as
SELECT CONVERT(varchar(40), NEWID()) 'rowid', *
INTO #temp
FROM master.dbo.sysdatabases
DECLARE @rowid varchar(40)
DECLARE @DBNAME nvarchar(50)
DECLARE @DATA_GROWTH int
DECLARE @LOG_GROWTH int
DECLARE @DATA_NAME nvarchar(100)
DECLARE @LOG_NAME nvarchar(100)
DECLARE @LOG_FILENAME nvarchar(100)
DECLARE @DATA_FILENAME nvarchar(100)
DECLARE @SERVERNAME nvarchar(100)
DECLARE @LOG_SIZE_PAGES int
DECLARE @LOG_GROWTH_STATUS int
DECLARE @DATA_SIZE_PAGES int
DECLARE @DATA_GROWTH_STATUS int
SET @SERVERNAME = 'BSGLABDB'
-- Get first row
SELECT @rowid = MIN(rowid)
FROM #temp
WHILE @rowid IS NOT NULL
BEGIN
SET @DBNAME = ''
SET @DATA_GROWTH = 0
-- Do something with the row data
SELECT @DBNAME = name
FROM #temp
WHERE rowid = @rowid
--get mdf information
SELECT @DATA_GROWTH = C.GROWTH ,
@DATA_NAME = C.NAME,
@DATA_FILENAME = C.FILENAME,
@DATA_SIZE_PAGES = B.SIZE,
@DATA_GROWTH_STATUS = B.STATUS
FROM MASTER.DBO.SYSDATABASES A
INNER JOIN SYSFILES B
ON B.FILEID = 1
INNER JOIN MASTER.dbo.sysaltfiles C
ON C.DBID = A.DBID AND C.FILEID = 1
WHERE A.NAME = @DBNAME
--get ldf information
--Insert into DB INFO
SELECT @LOG_GROWTH = C.GROWTH,
@LOG_NAME = C.NAME,
@LOG_FILENAME = C.FILENAME,
@LOG_SIZE_PAGES = B.SIZE,
@LOG_GROWTH_STATUS = B.STATUS
FROM MASTER.DBO.SYSDATABASES A
INNER JOIN SYSFILES B
ON B.FILEID = 1
INNER JOIN MASTER.dbo.sysaltfiles C
ON C.DBID = A.DBID AND C.FILEID = 2
WHERE A.NAME = @DBNAME
IF NOT EXISTS
(SELECT * FROM SYSTEMADM.DBINFO
WHERE SYSTEMADM.DBINFO.DBNAME = @DBNAME AND
SYSTEMADM.DBINFO.SERVERNAM E = @SERVERNAME)
BEGIN
INSERT INTO SYSTEMADM.DBINFO(SERVERNAM E, DBNAME, DATA_NAME, LOG_NAME, DATA_FILENAME, LOG_FILENAME, DATA_GROWTH, LOG_GROWTH, DATA_SIZE_PAGES, LOG_SIZE_PAGES, DATA_GROWTH_STATUS, LOG_GROWTH_STATUS)
VALUES
(@SERVERNAME, @DBNAME, @DATA_NAME, @LOG_NAME, @DATA_FILENAME, @LOG_FILENAME, @DATA_GROWTH, @LOG_GROWTH, @DATA_SIZE_PAGES, @LOG_SIZE_PAGES, @DATA_GROWTH_STATUS, @LOG_GROWTH_STATUS)
END
IF EXISTS (SELECT * FROM SYSTEMADM.DBINFO
WHERE SYSTEMADM.DBINFO.DBNAME = @DBNAME AND
SYSTEMADM.DBINFO.SERVERNAM E = @SERVERNAME)
BEGIN
UPDATE SYSTEMADM.DBINFO
SET DATA_NAME = @DATA_NAME,
LOG_NAME = @LOG_NAME,
DATA_FILENAME = @DATA_FILENAME,
LOG_FILENAME = @LOG_FILENAME,
DATA_GROWTH = @DATA_GROWTH,
LOG_GROWTH = @LOG_GROWTH,
DATA_SIZE_PAGES = @DATA_SIZE_PAGES,
LOG_SIZE_PAGES = @LOG_SIZE_PAGES,
DATA_GROWTH_STATUS = @DATA_GROWTH_STATUS,
LOG_GROWTH_STATUS = @LOG_GROWTH_STATUS
WHERE SYSTEMADM.DBINFO.DBNAME = 'DEVUFCP' AND
SYSTEMADM.DBINFO.SERVERNAM E = @SERVERNAME
END
SELECT @rowid = MIN(rowid)
FROM #temp
WHERE rowid > @rowid
END
drop table #temp
--SELECT * FROM SYSTEMADM.DBINFO
Everything works great except the status and the size are all the same through out the databases..?
GO
--EXEC SYSTEMADM.sp_DBInfo
CREATE TABLE [DBINFO] (
[ROWID] [int] IDENTITY (1, 1) NOT NULL ,
[SERVERNAME] [nvarchar] (50) COLLATE SQL_Latin1_General_CP1_CI_
[DBNAME] [nvarchar] (50) COLLATE SQL_Latin1_General_CP1_CI_
[DATA_NAME] [nvarchar] (100) COLLATE SQL_Latin1_General_CP1_CI_
[LOG_NAME] [nvarchar] (100) COLLATE SQL_Latin1_General_CP1_CI_
[DATA_FILENAME] [nvarchar] (100) COLLATE SQL_Latin1_General_CP1_CI_
[LOG_FILENAME] [nvarchar] (100) COLLATE SQL_Latin1_General_CP1_CI_
[DATA_GROWTH] [int] NULL ,
[LOG_GROWTH] [int] NULL ,
[CREATED_DATE] [datetime] NULL CONSTRAINT [DF_DSTATS_INFO_CREATED_DA
[DATA_SIZE_PAGES] [int] NULL ,
[LOG_SIZE_PAGES] [int] NULL ,
[DATA_GROWTH_STATUS] [int] NULL ,
[LOG_GROWTH_STATUS] [int] NULL
) ON [PRIMARY]
GO
ALTER procedure SYSTEMADM.sp_DBInfo
as
SELECT CONVERT(varchar(40), NEWID()) 'rowid', *
INTO #temp
FROM master.dbo.sysdatabases
DECLARE @rowid varchar(40)
DECLARE @DBNAME nvarchar(50)
DECLARE @DATA_GROWTH int
DECLARE @LOG_GROWTH int
DECLARE @DATA_NAME nvarchar(100)
DECLARE @LOG_NAME nvarchar(100)
DECLARE @LOG_FILENAME nvarchar(100)
DECLARE @DATA_FILENAME nvarchar(100)
DECLARE @SERVERNAME nvarchar(100)
DECLARE @LOG_SIZE_PAGES int
DECLARE @LOG_GROWTH_STATUS int
DECLARE @DATA_SIZE_PAGES int
DECLARE @DATA_GROWTH_STATUS int
SET @SERVERNAME = 'BSGLABDB'
-- Get first row
SELECT @rowid = MIN(rowid)
FROM #temp
WHILE @rowid IS NOT NULL
BEGIN
SET @DBNAME = ''
SET @DATA_GROWTH = 0
-- Do something with the row data
SELECT @DBNAME = name
FROM #temp
WHERE rowid = @rowid
--get mdf information
SELECT @DATA_GROWTH = C.GROWTH ,
@DATA_NAME = C.NAME,
@DATA_FILENAME = C.FILENAME,
@DATA_SIZE_PAGES = B.SIZE,
@DATA_GROWTH_STATUS = B.STATUS
FROM MASTER.DBO.SYSDATABASES A
INNER JOIN SYSFILES B
ON B.FILEID = 1
INNER JOIN MASTER.dbo.sysaltfiles C
ON C.DBID = A.DBID AND C.FILEID = 1
WHERE A.NAME = @DBNAME
--get ldf information
--Insert into DB INFO
SELECT @LOG_GROWTH = C.GROWTH,
@LOG_NAME = C.NAME,
@LOG_FILENAME = C.FILENAME,
@LOG_SIZE_PAGES = B.SIZE,
@LOG_GROWTH_STATUS = B.STATUS
FROM MASTER.DBO.SYSDATABASES A
INNER JOIN SYSFILES B
ON B.FILEID = 1
INNER JOIN MASTER.dbo.sysaltfiles C
ON C.DBID = A.DBID AND C.FILEID = 2
WHERE A.NAME = @DBNAME
IF NOT EXISTS
(SELECT * FROM SYSTEMADM.DBINFO
WHERE SYSTEMADM.DBINFO.DBNAME = @DBNAME AND
SYSTEMADM.DBINFO.SERVERNAM
BEGIN
INSERT INTO SYSTEMADM.DBINFO(SERVERNAM
VALUES
(@SERVERNAME, @DBNAME, @DATA_NAME, @LOG_NAME, @DATA_FILENAME, @LOG_FILENAME, @DATA_GROWTH, @LOG_GROWTH, @DATA_SIZE_PAGES, @LOG_SIZE_PAGES, @DATA_GROWTH_STATUS, @LOG_GROWTH_STATUS)
END
IF EXISTS (SELECT * FROM SYSTEMADM.DBINFO
WHERE SYSTEMADM.DBINFO.DBNAME = @DBNAME AND
SYSTEMADM.DBINFO.SERVERNAM
BEGIN
UPDATE SYSTEMADM.DBINFO
SET DATA_NAME = @DATA_NAME,
LOG_NAME = @LOG_NAME,
DATA_FILENAME = @DATA_FILENAME,
LOG_FILENAME = @LOG_FILENAME,
DATA_GROWTH = @DATA_GROWTH,
LOG_GROWTH = @LOG_GROWTH,
DATA_SIZE_PAGES = @DATA_SIZE_PAGES,
LOG_SIZE_PAGES = @LOG_SIZE_PAGES,
DATA_GROWTH_STATUS = @DATA_GROWTH_STATUS,
LOG_GROWTH_STATUS = @LOG_GROWTH_STATUS
WHERE SYSTEMADM.DBINFO.DBNAME = 'DEVUFCP' AND
SYSTEMADM.DBINFO.SERVERNAM
END
SELECT @rowid = MIN(rowid)
FROM #temp
WHERE rowid > @rowid
END
drop table #temp
--SELECT * FROM SYSTEMADM.DBINFO
Everything works great except the status and the size are all the same through out the databases..?
GO
ASKER
oh i got it
SELECT @DATA_GROWTH = C.GROWTH ,
@DATA_NAME = C.NAME,
@DATA_FILENAME = C.FILENAME,
@DATA_SIZE_PAGES = C.SIZE,
@DATA_GROWTH_STATUS = C.STATUS
FROM MASTER.DBO.SYSDATABASES A
-- INNER JOIN SYSFILES B
-- ON B.FILEID = 1
INNER JOIN MASTER.dbo.sysaltfiles C
ON C.DBID = A.DBID AND C.FILEID = 1
WHERE A.NAME = @DBNAME
Can't read the sysfiles it be for the database your running it in ...MYDATABASE and not equal to the database
@DBNAME
SELECT @DATA_GROWTH = C.GROWTH ,
@DATA_NAME = C.NAME,
@DATA_FILENAME = C.FILENAME,
@DATA_SIZE_PAGES = C.SIZE,
@DATA_GROWTH_STATUS = C.STATUS
FROM MASTER.DBO.SYSDATABASES A
-- INNER JOIN SYSFILES B
-- ON B.FILEID = 1
INNER JOIN MASTER.dbo.sysaltfiles C
ON C.DBID = A.DBID AND C.FILEID = 1
WHERE A.NAME = @DBNAME
Can't read the sysfiles it be for the database your running it in ...MYDATABASE and not equal to the database
@DBNAME
declare @l_db_name varchar(50)
SET @l_db_name = 'TESTTC'
set @retType = N'@cnt varchar(20) OUTPUT'
set @cmd = N'select ceiling((size * 8192)/(1024.0 * 1024.0)), @CNT = case when status & 0x100000 = 0 then
convert(varchar,ceiling((g
+ 'else convert (varchar, growth) + '' Percent''' + char(10)+char(13)
+ 'end' + char(10)+char(13)
+ 'from ' + @l_db_name + '.dbo.sysfiles'
set @retType = N'@cnt varchar(20) OUTPUT'
exec sp_executesql @cmd, @retType OUTPUT