2012-07-25 90 views
1

我需要能够列出给定表的列。 当我运行以下命令:sp_executesql不返回值

DECLARE @ColList Varchar(Max) 
DECLARE @TabName varchar(100) = 'CT_CONF' 

SELECT @ColList = CASE WHEN @ColList IS NULL THEN '''' ELSE @ColList + ',' END + column_name 
        from INFORMATION_SCHEMA.COLUMNS 
        where TABLE_NAME = @TabName 
         and DATA_TYPE not in ('xml','Text','Image','Geometry','Geography') 
         and COLUMN_NAME not in ('LAST_MODIFIED') 
        order by ordinal_position     

select @ColList 

我得到的输出我需要的,但是,当我尝试如下sp_executesql的运行,我得不到任何回报。

DECLARE @TabName varchar(100) = 'CT_CONF' 

DECLARE @SQL NVarchar(Max) 
DECLARE @ColList Varchar(Max) 
Declare @Params nvarchar(Max) 

SET @SQL = N' 
      select @ColList = CASE WHEN @ColList IS NULL THEN '''' ELSE @ColList + '','' END + column_name 
        from INFORMATION_SCHEMA.COLUMNS 
        where TABLE_NAME = ''@TabName '' 
         and DATA_TYPE not in (''xml'',''Text'',''Image'',''Geometry'',''Geography'') 
         and COLUMN_NAME not in (''LAST_MODIFIED'') 
        order by ordinal_position 
      ' 

set @Params = N'@ColList varchar(Max) OUTPUT' 

EXEC sp_executesql @SQL, @Params, @ColList OUTPUT 

select @ColList 

我在做什么错?

感谢, 尤金

+1

你有一个名为'@ SourceTable'的表吗? – 2012-07-25 18:05:00

+0

我的错,它应该读取@TabName。我做了一个改变。仍然无法工作。 – user1549571 2012-07-25 18:22:21

+0

您需要将表名连接到动态查询或将其作为参数传递。现在它正在寻找名为'@ TabName'的表,当它应该查找'CT_CONF'时。 – 2012-07-25 18:28:28

回答

2

尝试:

'... 
    where TABLE_NAME = ''' + @TabName + ''' 
...' 

或(可能更好):

'... 
     where TABLE_NAME = @TabName 
...' 
set @Params = N'@TabName varchar(100), @ColList varchar(Max) OUTPUT' 

EXEC sp_executesql @SQL, @Params, @TabName, @ColList OUTPUT 

这些都是真的只是在评论从@Mikael埃里克森的建议实现。

+0

谢谢,它工作。 – user1549571 2012-07-25 20:59:59