我想列出所有从哪个了Adventureworks表我选择列。什么T-SQL语句或存储过程中我能够执行来查看所有列的这个名单?我想用我的C#web应用程序输入一个输入参数= table_name的,然后让所有的COLUMN_NAMES作为输出的一个列表。现在,我尝试执行存储过程其运作SP_COLUMNS,但我不能只是选择和exec结合的一列。没有任何人知道如何做到这一点?

谢谢大家对所有您的答复,但没有你的答案做什么,我需要。让我解释一下我的问题更适合你。下面回报什么,我需要查询。但我的问题是将这一逻辑放进一个接受输入参数的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'

我如何做到这一点?

有帮助吗?

解决方案

您不需要创建语句作为字符串 - 事实上,那正是你搞乱了。尝试这样:

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

其他提示

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

要为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 @Rows=@@ROWCOUNT
    IF @Rows=0
    BEGIN
        SET @ReturnValue= 1  --table not found!!
    END
    RETURN @ReturnValue 

END

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

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

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

一个答复您的编辑问题:

因为你建立一个动态的字符串,而该动态字符串中您必须在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 =(无论他们通过),要么没有

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top