3

選択したAdventureworksテーブルのすべての列を一覧表示しようとしています。このすべての列のリストを表示するには、どのT-sQLステートメントまたはストアドプロシージャを実行できますか?C#Webアプリを使用して1つの入力パラメーター= table_nameを入力し、すべてのcolumn_namesのリストを出力として取得したいと思います。現在、動作するsp_columnsストアドプロシージャを実行しようとしていますが、selectとexecを組み合わせた1つの列だけを取得することはできません。誰かがこれを行う方法を知っていますか?

すべての返信に感謝しますが、どの回答も私が必要とすることをしません。私の問題についてもっと説明させてください。以下のクエリは、必要なものを返します。しかし、私の問題は、このロジックを入力パラメーターを受け取る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'

どうすればこれを達成できますか?

4

6 に答える 6

8
select * from sys.columns where object_id = object_id(@tablename);
于 2010-04-08T20:27:39.997 に答える
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
于 2010-04-08T21:22:35.970 に答える
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 @Rows=@@ROWCOUNT
    IF @Rows=0
    BEGIN
        SET @ReturnValue= 1  --table not found!!
    END
    RETURN @ReturnValue 

END

戻り値を確認して1を取得した場合、指定された@TableNameパラメーターに一致するテーブルは見つかりませんでした。これを使用して、アプリケーションでエラーメッセージを表示できます。

于 2010-04-08T20:39:59.833 に答える
2
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'TableName' AND TABLE_CATALOG = 'DatabaseName'
于 2010-04-08T20:39:30.757 に答える
1

Remus Rusanuの回答を使用するかSqlConnection.GetSchema()、C#コードの関数を使用してください

于 2010-04-08T20:34:50.363 に答える
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=(渡されたものは何でも)であるか、そうでないかのどちらかです。

于 2010-04-08T21:19:51.967 に答える