存储过程中的输出参数为null

时间:2012-11-08 13:52:54

标签: sql sql-server sql-server-2008

我似乎无法正确获取输出参数,在我正在考虑'TEMPTABLE'时它是空的?

create table TEMPTABLE
(
  Id int identity primary key,
  Name nvarchar(50) not null,
);
GO

insert into TEMPTABLE(Name) values('Name 1');
GO

DECLARE @PARMOUTP nvarchar(50)
DECLARE @ParameterDefinition AS NVARCHAR(2000)
DECLARE @DestTable VARCHAR(50)
declare @sql nvarchar(max)

    set @sql = 'SELECT   OBJECT_NAME(OBJECT_ID) AS TABLENAME 
                FROM     SYS.IDENTITY_COLUMNS  
                WHERE OBJECT_NAME(OBJECT_ID) = @DestTable'

set @DestTable = 'TEMPTABLE'

set @ParameterDefinition = '@DestTable VARCHAR(50), @PARMOUTP VARCHAR(50) OUTPUT'


EXECUTE sp_executesql @sql,
                  @ParameterDefinition,
                  @DestTable,
                  @PARMOUTP OUTPUT

print @PARMOUTP;
print isnull(@PARMOUTP, 'PARMOUTP is null!');

我在这里做错了什么?

此致

麦克

2 个答案:

答案 0 :(得分:2)

您的查询不适用于带有一个参数的sp_executesql。 在查询中,您应该为该参数赋值并执行它。 像这样:

create table TEMPTABLE
(
  Id int identity primary key,
  Name nvarchar(50) not null,
);
GO

insert into TEMPTABLE(Name) values('Name 1');
GO

DECLARE @PARMOUTP nvarchar(50)
DECLARE @ParameterDefinition AS NVARCHAR(2000)
DECLARE @DestTable VARCHAR(50)
declare @sql nvarchar(max)

    set @sql = 'SELECT   @PARMOUTP = OBJECT_NAME(OBJECT_ID) AS TABLENAME 
                FROM     SYS.IDENTITY_COLUMNS  
                WHERE OBJECT_NAME(OBJECT_ID) = @DestTable'

set @DestTable = 'TEMPTABLE'

set @ParameterDefinition = '@DestTable VARCHAR(50), @PARMOUTP VARCHAR(50) OUTPUT'


EXECUTE sp_executesql @sql,
                  @ParameterDefinition,
                  @DestTable,
                  @PARMOUTP OUTPUT

print @PARMOUTP;
print isnull(@PARMOUTP, 'PARMOUTP is null!');

请记住,您正在从动态查询中返回标量值。

答案 1 :(得分:1)

在动态SQL语句中,您永远不会为输出参数指定任何值!

您正在选择表名作为结果集 - 但它永远不会存储到输出变量中。

试试这个:

set @sql = 'SELECT @PARMOUTP = OBJECT_NAME(OBJECT_ID)
            FROM SYS.IDENTITY_COLUMNS  
            WHERE OBJECT_NAME(OBJECT_ID) = @DestTable'