2010-04-08 26 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 =(無論他們通過了),或它沒有。

相關問題