簡體   English   中英

將參數傳遞給存儲過程

[英]Passing Parameters to a stored Procedure

我正在一個接受3個不同參數的項目中,日期是必需的,名字和姓氏是可選的。 我們在下面設置查詢,但是即使我更改報表(SSRS)上的參數,它仍然將@LetterCreated視為“ 1/1/1950”,關於如何獲取該參數以僅接受參數有任何想法嗎? 我們以這種方式設置日期,因為我們希望報表在初次打開時與所有報表一起顯示。

Alter Proc
AS 
BEGIN
SET NOCOUNT ON;

    DECLARE @LetterCreated DATETIME,
    @FirstName VARCHAR(20),
    @LastName VARCHAR(20) 

    SELECT @LetterCreated = '1/1/1950'
    SELECT @FirstName = ''
    SELECT @LastName = ''

    SELECT  
        LETTERCREATETIME,
        Firstname,
        LastName,
    From RedFlagAddress

    WHERE 
        CASE WHEN @LetterCreated='1/1/1950' 
             THEN '1/1/1950' 
             ELSE ISNULL(LETTERCREATETIME, '07/05/81')
        END = @LetterCreated 
    AND (LastName LIKE @LASTNAME + '%' AND FirstName LIKE @FirstNAME + '%')
    END

任何建議將不勝感激。

您正在過程中設置@lettercreated日期。 在過程中定義的變量在過程外部不可見。

您應該將參數聲明為參數,並在聲明中設置默認值

ALTER PROC yourproc
(
@LetterCreated DATETIME = '1950-1-1',
@FirstName VARCHAR(20) = '',
@LastName VARCHAR(20) = ''
)
as
begin
    select  
        LETTERCREATETIME,
        Firstname,
        LastName,
    From 
        RedFlagAddress
    where 
    (
         ISNULL(LETTERCREATETIME, '07/05/81') = @LetterCreated
         or
         @LetterCreated = '1950-1-1'
    )
    AND LastName LIKE @LASTNAME + '%' 
    AND FirstName LIKE @FirstNAME + '%'
end

與podiluska的答案類似,應按照podiluska的指示將參數設置為SP的一部分,但隨后應在SSRS中的“參數”中設置默認值。

這將使用戶可以看到默認值並將其用於訂閱,或者根據需要覆蓋它們。

Alter Proc Proc_Name
(
@LetterCreated DATETIME,
@FirstName VARCHAR(20) = null,
@LastName VARCHAR(20) = null
)
AS 
BEGIN
SET NOCOUNT ON;

這會將空值作為默認值傳遞給您,現在,如果沒有為FirstName和LastName提供值,則您的代碼應該能夠處理空值

我猜這里,但是您可能想要的是

  • 如果參數@LetterCreated為null,則根本不應將其用作過濾器
  • 如果RedFlagData.LETTERCREATETIME的數據為Null,則應將其與過濾日期'07/05/81' 07/05/81 '07/05/81'匹配

假設您已為@LetterCreated parameter設置了RDL/RDLC的“允許空值”檢查where需要更改的位置,可以如下設置可選過濾器:

ISNULL(@LetterCreated, LETTERCREATETIME) = ISNULL(LETTERCREATETIME, '07/05/81')

如果您擺脫了魔術日期,那么即使LETTERCREATETIME為空,也可以保證沒有應用任何日期過濾器:

ISNULL(@LetterCreated, LETTERCREATETIME) = ISNULL(LETTERCREATETIME) 
OR 
(@LetterCreated IS NULL AND LETTERCREATETIME IS NULL)

從而:

ALTER PROC XYZ
(
  @LetterCreated DATETIME,
  @FirstName VARCHAR(20) = NULL,
  @LastName VARCHAR(20) = NULL
)
as
begin
    select  
        LETTERCREATETIME,
        Firstname,
        LastName,
    From 
        RedFlagAddress
    where 
    (
       ISNULL(@LetterCreated, LETTERCREATETIME) = LETTERCREATETIME
       OR
       (@LetterCreated IS NULL AND LETTERCREATETIME IS NULL)
    )
    AND LastName LIKE ISNULL(@LastName, '') + '%'
    AND FirstName LIKE ISNULL(@FirstName, '') + '%'
end

一個警告:考慮到where子句中的功能操作量以及LIKEsORs ,該查詢的性能將很糟糕-希望RedFlagAddress是一個相對較小的表? 如果沒有,您可能需要重新考慮您的方法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM