2012-11-08 73 views
0

我似乎无法得到输出参数正确的,它是空在那里我exepecting“不是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!'); 

我在这里做错了什么?

问候,

迈克

+0

哪个SQL Server?你有没有尝试另一个数据库(可能有一些限制适用于当前)?我无法在2008 R2上重现该问题。 – OzrenTkalcecKrznaric

+0

SQL SERVER 2008 Ozren –

回答

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!'); 

请记住,你是从你的动态查询返回标值。

+0

Super!必须删除'AS TABLENAME',但它的作品。 非常感谢! –

1

在您的动态SQL语句,你永远分配的输出参数的任何值!

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

试试这个:

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