2017-10-18 38 views
0

我在SQL Server中有一個存儲過程。我想在通過null時設置默認值;否則,使用傳遞的值。但是,我不確定我的代碼是否反映了我想要的行爲。如果不是,我該怎麼辦?SQL Server存儲過程默認值行爲

CREATE PROCEDURE [dbo].[test] 
    (@PassedTableName nvarchar(100)) 
AS 
BEGIN 
    DECLARE @TableName AS NVarchar(255) = 'defaultTablenName' 

    SELECT @TableName = QUOTENAME(TABLE_NAME) 
    FROM INFORMATION_SCHEMA.TABLES 
    WHERE TABLE_NAME = @PassedTableName 

    DECLARE @sql0 AS NVARCHAR(MAX) 
    SELECT @sql0 = 'select count(*) from ' + @TableName 
    EXEC(@SQL0) 
+1

我不明白你在這裏試圖做什麼。 –

+1

select @TableName = isnull(QUOTENAME(TABLE_NAME),'defaultTablenName') –

+0

您是試圖設置可選參數還是僅向參數發送NULL? – NicoRiff

回答

3

只要指定的默認值的參數聲明時:

CREATE PROCEDURE [dbo].[test] 
    (@PassedTableName nvarchar(100) = 'defaultTableName') 

如果用戶通過一個參數,它會使用它。如果他們排除參數,則它將默認爲defaultTableName

但有一個警告。如果用戶包含該參數但明確指定了NULL(通過調用dbo.test @PassedTableName = NULL),該值將爲NULL。在這種情況下,我建議:

CREATE PROCEDURE [dbo].[test] 
    (@PassedTableName nvarchar(100) = NULL) 

IF @PassedTableName IS NULL 
SET @PassedTableName = 'defaultTableName' 
+0

應該聲明不使用'defaultTableName'而不使用null? – GuidoG

+0

@GuidoG聽起來不錯,原來的例子有點含糊。 – BradC

2

您可以通過使用COALESCE或參數聲明時specifiying默認值做到這一點。

CREATE PROCEDURE [dbo].[test] 
    (@PassedTableName nvarchar(100) = 'defaultTableName') 

DO STUFF WHERE tablename = COALESCE(@PassedTableName,'defaultTableName') 

要麼將​​工作。還有另一種方式使用IF

IF @PassedTableName IS NULL 
    SET @PassedTableName = 'defaultTableName';