Groups | Blog | Home
all groups > sql server (microsoft) > december 2005 >

sql server (microsoft) : Select Field from SP output


shumaker NO[at]SPAM cs.fsu.edu
12/26/2005 8:14:45 PM
I have a Stored procedure that outputs 3 columns. Sometimes I only
want a specific column though. Is there a way I can limit output to a
specific column using a SQL query that executes the below procedure?
It is a query running from Microsoft Excel's import date feature, so I
only want a single column in the destination column.


This is my procedure:

CREATE PROCEDURE CountLoaded
@DIS smallint = NULL,
@TYPE varchar(50) = NULL
AS
SELECT DIS, TYPE, SUM(NMBRLOADED)
FROM Loaded
WHERE DIS = COALESCE(@DIS, DIS) AND SUBSTRING(DATETIMESTAMP, 9, 1) =
'3' AND TYPE = COALESCE(@TYPE, TYPE)
GROUP BY TYPE, DIS


And the table it operates on:

CREATE TABLE [Loaded] (
[PISD] [smallint] NULL ,
[DIS] [smallint] NULL ,
[TYPE] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[DATETIMESTAMP] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS
NULL ,
[NMBRLOADED] [int] NULL
) ON [PRIMARY]
Jens
12/27/2005 1:02:09 AM
No there is now way of conditional horizantal narrowing unless you use
dynmiac sql with all it (dis-)advantages.

http://www.sommarskog.se/dynamic_sql.html

HTH, Jens Suessmeyer.
urchin
12/27/2005 6:02:28 AM
You can use sp_executesql like so: (@switch determines which version
of the @statement gets exec'd)

declare @statement nvarchar(1000), @switch bit
set @switch = 0

if @switch = 0
set @statement = "SELECT DIS, SUM(NMBRLOADED) FROM Loaded WHERE DIS =
COALESCE(@DIS, DIS) AND SUBSTRING(DATETIMESTAMP, 9, 1) = '3' AND TYPE =
COALESCE(@TYPE, TYPE) GROUP BY DIS"
else
set @statement = "SELECT DIS, TYPE, SUM(NMBRLOADED) FROM Loaded WHERE
DIS = COALESCE(@DIS, DIS) AND SUBSTRING(DATETIMESTAMP, 9, 1) = '3' AND
TYPE = COALESCE(@TYPE, TYPE) GROUP BY TYPE, DIS"

execute sp_executesql @sql = @statement
shumaker NO[at]SPAM cs.fsu.edu
12/27/2005 2:48:37 PM
Thanks
Phil
1/3/2006 6:36:37 AM
Why use dynamic SQL? Since there are only two possible versions of
the query to be run, a simple decision branch in the code, controlled
by an additional run-time parameter, would suffice:


CREATE PROCEDURE CountLoaded
@DIS smallint = NULL,
@TYPE varchar(50) = NULL,
@allcols bit = 1 -- Return all 3 columns by default
AS

IF @allcols = 1

SELECT DIS, TYPE, SUM(NMBRLOADED)
FROM Loaded
WHERE DIS = COALESCE(@DIS, DIS) AND SUBSTRING(DATETIMESTAMP, 9,
1) =
'3' AND TYPE = COALESCE(@TYPE, TYPE)
GROUP BY TYPE, DIS

ELSE

SELECT SUM(NMBRLOADED) -- or whichever column you need
FROM Loaded
WHERE DIS = COALESCE(@DIS, DIS) AND SUBSTRING(DATETIMESTAMP, 9,
1) =
'3' AND TYPE = COALESCE(@TYPE, TYPE)
GROUP BY TYPE, DIS
AddThis Social Bookmark Button