2017-10-18 70 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';