2010-04-08 23 views
3

我想列出我选择的任何Adventureworks表的所有列。我可以执行什么T-sQL语句或存储过程来查看所有列的列表?我想用我的C#web应用程序输入一个输入参数= table_name,然后获取所有列名作为输出的列表。现在我正在尝试执行sp_columns存储过程,但是我无法仅使用select和exec组合的一列。有人知道怎么做这个吗?在T-SQL中如何显示给定表名的列?

谢谢大家的所有答复,但没有你的答案做我需要的。让我更为你解释我的问题。下面的查询返回我需要的。但我的问题是将这个逻辑合并到一个接受输入参数的SP中。因此,这里是成功的SQL语句:

select col.name from sysobjects obj inner join syscolumns col 
    on obj.id = col.id 
    where obj.name = 'AddressType' 
    order by obj.name 

而且目前我的SP的样子:

CREATE PROCEDURE [dbo].[getColumnNames] 
    @TableName VarChar(50) 
    AS 

    BEGIN 
    SET NOCOUNT ON; 
    SET @TableName = RTRIM(@TableName) 
    DECLARE @cmd AS NVARCHAR(max) 
    SET @cmd = N'SELECT col.name from sysobjects obj ' + 
    'inner join syscolumns col on obj.id = col.id ' + 
    'where obj.name = ' + @TableName 
    EXEC sp_executesql @cmd 
    END 

但我运行上面的

exec getColumnNames 'AddressType' 

,它给我的错误:

Invalid column name 'AddressType' 

我该怎么办这么做?

+0

这是一个语法错误,请参阅下面的答案。 – egrunin 2010-04-08 21:21:08

回答

5

您不需要将该语句创建为一个字符串 - 事实上,这就是搞砸了你。试试这个:

CREATE PROCEDURE [dbo].[getColumnNames] @TableName VarChar(50) AS 

BEGIN 
SET NOCOUNT ON; 
SELECT col.name FROM sysobjects obj 
INNER JOIN syscolumns col ON obj.id = col.id 
WHERE obj.name = @TableName 
END 
+0

太棒了!非常感谢你!这是答案! – salvationishere 2010-04-08 21:26:32

8
select * from sys.columns where object_id = object_id(@tablename); 
+0

我很感谢你的回答,但请你现在看看我编辑的问题吗? – salvationishere 2010-04-08 21:13:05

1

使用莱姆斯Rusanu答案或使用SqlConnection.GetSchema()功能从C#代码

2
SELECT * 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'TableName' AND TABLE_CATALOG = 'DatabaseName' 
3

显示为database.dbo.yourtable信息试试这个:

SELECT 
    * 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE 
     TABLE_CATALOG ='database' 
     AND TABLE_SCHEMA='dbo' 
     AND TABLE_NAME ='yourtable' 
    ORDER BY ORDINAL_POSITION 

编辑基于OP的编辑

你不要需要动态sql,只需使用给定参数:

CREATE PROCEDURE [dbo].[getColumnNames] 
@TableName VarChar(50) 
AS 
BEGIN 
    SET NOCOUNT ON; 
    DECLARE @Rows   int 
      ,@ReturnValue int 
    SET @ReturnValue=0 
    SELECT 
     col.name 
     FROM sysobjects   obj 
      inner join syscolumns col on obj.id = col.id 
     WHERE obj.name = @TableName 
     ORDER BY obj.name 
    SELECT @[email protected]@ROWCOUNT 
    IF @Rows=0 
    BEGIN 
     SET @ReturnValue= 1 --table not found!! 
    END 
    RETURN @ReturnValue 

END 

,如果你检查返回值,并获得了1则没有桌子上找到指定@tablename参数匹配。您可以使用它在应用程序中给出错误消息。

1

到回答您的编辑问题:

您的脚本不工作,因为你正在构建一个动态的字符串,而该动态字符串中您必须在WHERE子句中添加引号字符串要放置。修改后的代码是:

BEGIN 
SET NOCOUNT ON; 
SET @TableName = RTRIM(@TableName) 
DECLARE @cmd AS NVARCHAR(max) 
SET @cmd = N'SELECT col.name from sysobjects obj ' + 
'inner join syscolumns col on obj.id = col.id ' + 
'where obj.name = ''' + @TableName + '''' 
EXEC sp_executesql @cmd 
END 

但是,为什么要创建动态字符串?这将做同样的事情,而不是需要动态SQL的开销:

BEGIN 
SET NOCOUNT ON; 
SET @TableName = RTRIM(@TableName) 
SELECT col.name from sysobjects obj 
inner join syscolumns col on obj.id = col.id 
where obj.name = @TableName 
END 

如果你担心SQL注入,是不是这里有问题 - 无论是obj.name =(无论他们通过了),或它没有。

相关问题