Please start any new threads on our new
site at https://forums.sqlteam.com. We've got lots of great SQL Server
experts to answer whatever question you can come up with.
Author |
Topic |
muniappan
Starting Member
7 Posts |
Posted - 2008-01-21 : 14:15:17
|
Hi, My SP is,ALTER PROCEDURE dbo.InventorySalesSummaryForReport(@ItemNumber nvarchar(30),@StoreId nvarchar(500),@Year int)ASDECLARE @SQL nvarchar(1000)-- Searching ItemNumber in Inventory_SKUDECLARE @Count intDECLARE @ItemNumSKU varchar(50)SET @SQL = N'SELECT @Count12 =COUNT(*) FROM Inventory WHERE Store_Id in (@StoreId1) AND ItemNum = @ItemNumber1'EXECUTE sp_executesql @SQL,N'@Count12 int OUTPUT,@StoreId1 nvarchar(500),@ItemNumber1 nvarchar(30)',@Count12=@Count OUTPUT,@StoreId1 = @StoreId,@ItemNumber1 = @ItemNumberIF (@Count = 0)BEGINSET @SQL = N'SELECT @ItemNumSKU1 = ItemNum FROM Inventory_SKUS WHERE Store_Id in (@StoreId1) AND AltSKU = @ItemNumber1'EXECUTE sp_executesql @SQL,N'@ItemNumSKU1 nvarchar(30) OUTPUT,@StoreId1 nvarchar(500),@ItemNumber1 nvarchar(30)',@StoreId1 = @StoreId,@ItemNumber1 = @ItemNumber,@ItemNumSKU1=@ItemNumSKU OUTPUTSET @ItemNumber = @ItemNumSKUEND-- Creating table variable to have values from 1 to 12CREATE TABLE #MonthSales (MonthNumber int, MonthCost money,MonthPrice money,MonthQuan bigint)DECLARE @Cnt INTSET @Cnt = 1WHILE(@Cnt <= 12)BEGININSERT INTO #MonthSales VALUES(@Cnt,0,0,0)SET @Cnt = @Cnt + 1END--Joining query result with the table variable to get required result DECLARE @Status1 Char(1)SET @Status1 = 'C'-- putting ' for comma seperated storeidSET @SQL = N'SELECT' SET @SQL = @SQL + N' MS.MonthNumber,'SET @SQL = @SQL + N' ISNULL(Temp.MonthCost,0) MonthCost,'SET @SQL = @SQL + N' ISNULL(Temp.MonthPrice,0) MonthPrice,'SET @SQL = @SQL + N' ISNULL(Temp.MonthQuan,0) MonthQuan'SET @SQL = @SQL + N' FROM'SET @SQL = @SQL + N' (SELECT 'SET @SQL = @SQL + N' DATEPART(mm, DateTime) Month#'SET @SQL = @SQL + N' ,SUM(CostPer*Quantity) As MonthCost'SET @SQL = @SQL + N' ,SUM(PricePer*Quantity) AS MonthPrice'SET @SQL = @SQL + N' ,SUM(Quantity) AS MonthQuan 'SET @SQL = @SQL + N' FROM 'SET @SQL = @SQL + N' Invoice_Totals 'SET @SQL = @SQL + N' INNER JOIN Invoice_Itemized ON Invoice_Totals.Invoice_Number = Invoice_Itemized.Invoice_Number 'SET @SQL = @SQL + N' WHERE 'SET @SQL = @SQL + N' Status = @Status AND Invoice_Totals.Store_ID in (@StoreId1) 'SET @SQL = @SQL + N' AND ItemNum = @ItemNumber1'SET @SQL = @SQL + N' AND DATEPART(yy,datetime)=@Year1'SET @SQL = @SQL + N' GROUP BY'SET @SQL = @SQL + N' DATEPART(mm, DateTime)'SET @SQL = @SQL + N' ) Temp 'SET @SQL = @SQL + N' RIGHT OUTER JOIN #MonthSales MS ON MS.MonthNumber = Temp.Month#'SET @SQL = @SQL + N' ORDER BY MS.MonthNumber'EXECUTE sp_executesql @SQL,N'@Status char(1),@StoreId1 nvarchar(500),@ItemNumber1 nvarchar(30),@Year1 int',@Status = @Status1,@StoreId1 = @StoreId,@ItemNumber1 = @ItemNumber,@Year1=@YearIt is working If I am passing sigle storeId to the above SP. If I am selecting multiple StoreIDs from the report. It is not returning correct value. Can you please give me a suggestion?Thanks |
|
visakh16
Very Important crosS Applying yaK Herder
52326 Posts |
Posted - 2008-01-22 : 03:39:31
|
One method to solve this is to use Exec statement and build string as follows:-SET @SQL = 'SELECT @Count12 =COUNT(*) FROM Inventory WHERE Store_Id in (' +@StoreId1 + ') AND ItemNum = ' + @ItemNumber1EXEC (@SQL).... |
|
|
ditch
Master Smack Fu Yak Hacker
1466 Posts |
|
muniappan
Starting Member
7 Posts |
Posted - 2008-01-22 : 15:28:03
|
Thank you. It is working now |
|
|
spshindagi
Starting Member
11 Posts |
Posted - 2008-01-24 : 02:43:57
|
best method for comma seeprated parameter, is to use functions. i following function may help u.CREATE FUNCTION parmaeterdcomma (@list nvarchar(MAX), @delimiter nchar(1) = N',') RETURNS @tbl TABLE (listpos int IDENTITY(1, 1) NOT NULL, str varchar(4000) NOT NULL, nstr nvarchar(2000) NOT NULL) ASBEGIN DECLARE @endpos int, @startpos int, @textpos int, @chunklen smallint, @tmpstr nvarchar(4000), @leftover nvarchar(4000), @tmpval nvarchar(4000) SET @textpos = 1 SET @leftover = '' WHILE @textpos <= datalength(@list) / 2 BEGIN SET @chunklen = 4000 - datalength(@leftover) / 2 SET @tmpstr = @leftover + substring(@list, @textpos, @chunklen) SET @textpos = @textpos + @chunklen SET @startpos = 0 SET @endpos = charindex(@delimiter COLLATE Slovenian_BIN2, @tmpstr) WHILE @endpos > 0 BEGIN SET @tmpval = ltrim(rtrim(substring(@tmpstr, @startpos + 1, @endpos - @startpos - 1))) INSERT @tbl (str, nstr) VALUES(@tmpval, @tmpval) SET @startpos = @endpos SET @endpos = charindex(@delimiter COLLATE Slovenian_BIN2, @tmpstr, @startpos + 1) END SET @leftover = right(@tmpstr, datalength(@tmpstr) / 2 - @startpos) END INSERT @tbl(str, nstr) VALUES (ltrim(rtrim(@leftover)), ltrim(rtrim(@leftover))) RETURNENDlove all |
|
|
|
|
|
|
|