एक और दृष्टिकोण एक सहायक समारोह और एक प्रक्रिया है जो एक-एक वस्तु को अलग SQL कथन लागू करने की अनुमति की तैयारी शामिल है (टेबल, डेटाबेस, वगैरह) एक सूची में सहायक कार्य SSRS Parameter question से आता है और एक अल्पविराम सीमांकित सूची को एक तालिका में विभाजित करता है।
-- from https://stackoverflow.com/questions/512105/passing-multiple-values-for-a-single-parameter-in-reporting-services
CREATE FUNCTION [dbo].[fn_MVParam]
(@RepParam NVARCHAR(4000), @Delim CHAR(1)= ',')
RETURNS @Values TABLE (Param NVARCHAR(4000))AS
BEGIN
DECLARE @chrind INT
DECLARE @Piece NVARCHAR(100)
SELECT @chrind = 1
WHILE @chrind > 0
BEGIN
SELECT @chrind = CHARINDEX(@Delim,@RepParam)
IF @chrind > 0
SELECT @Piece = LEFT(@RepParam,@chrind - 1)
ELSE
SELECT @Piece = @RepParam
INSERT @Values(Param) VALUES(CAST(@Piece AS VARCHAR))
SELECT @RepParam = RIGHT(@RepParam,LEN(@RepParam) - @chrind)
IF LEN(@RepParam) = 0 BREAK
END
RETURN
END
GO
प्रक्रिया ProcistListSQL प्रक्रिया के लिए कोड नीचे दिया गया है।
-- @SQL to execute shall include {RP} as the replacement expression that
-- will evaluate to all the items in the comma delimited list
-- Also, please include a double quote " rather than two single quotes ''
-- in the input statement.
CREATE PROCEDURE [dbo].[ProcessListSQL] (
@CommaDelimitedList AS NVARCHAR(MAX),
@SQLtoExecute AS NVARCHAR(MAX))
AS BEGIN
DECLARE @Statements TABLE
( PK INT IDENTITY(1,1) PRIMARY KEY,
SQLObject NVARCHAR (MAX)
)
SET @SQLtoExecute = REPLACE (@SQLtoExecute, '"', '''')
INSERT INTO @Statements
SELECT PARAM FROM [dbo].[fn_MVParam](@CommaDelimitedList,',')
DECLARE @i INT
SELECT @i = MIN(PK) FROM @Statements
DECLARE @max INT
SELECT @max = MAX(PK) FROM @Statements
DECLARE @SQL AS NVARCHAR(MAX) = NULL
DECLARE @Object AS NVARCHAR(MAX) = NULL
WHILE @i <= @max
BEGIN
SELECT @Object = SQLObject FROM @Statements WHERE PK = @i
SET @SQL = REPLACE(@SQLtoExecute, '{RP}', @Object)
-- Uncommend below to check the SQL
-- PRINT @SQL
EXECUTE sp_executesql @SQL
SELECT @Object = NULL
SELECT @SQL = NULL
SET @i = @i + 1
END
END
GO
ProcessListSQL प्रक्रिया दो पैरामीटर लेती है। पहला एक कॉमा सीमांकित स्ट्रिंग है जिसमें ऑब्जेक्ट्स की सूची होती है जिसे साइकल किया जाएगा। दूसरा पैरामीटर एक स्ट्रिंग है जिसमें SQL शामिल है जिसे पहले पैरामीटर में प्रत्येक ऑब्जेक्ट के साथ निष्पादित किया जाएगा।
नीचे दिए गए उदाहरण में, चार डेटाबेस बनाए गए हैं। ध्यान दें कि {rp} को पहले पैरामीटर में प्रत्येक ऑब्जेक्ट के साथ प्रतिस्थापित किया गया है और प्रत्येक स्थान पर डबल कोट्स की आवश्यकता होती है जहां SQL कथन में सिंगल कोट्स की आवश्यकता होती है।
EXECUTE ProcessListSQL 'rice,apples,cheese,tomatos',
'CREATE DATABASE [{rp}] CONTAINMENT = NONE
ON PRIMARY (NAME = N"{rp}",
FILENAME = N"D:\data\user\{rp}.mdf" ,
SIZE = 4096KB ,
FILEGROWTH = 1024KB)
LOG ON
(NAME = N"{rp}_log",
FILENAME = N"D:\DATA\USER\{rp}_log.ldf" ,
SIZE = 1024KB ,
FILEGROWTH = 10%)'
+1 तालिका चर एरे के लिए एक महान प्रतिस्थापन हैं – brian
एक आकर्षण की तरह काम किया, धन्यवाद! – Chris