質問

私は、私が選択したいずれかのAdventureWorksテーブルからすべての列のリストにしようとしています。どのようなT-SQLステートメントまたはストアドプロシージャ私は、すべての列のリストを見るために実行することができますか?私は、入力1、入力パラメータ= TABLE_NAMEに私のC#のウェブアプリを使用して、出力として、すべてのCOLUMN_NAMESのリストを取得したいです。今、私は作品PROCを保存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

あなたは戻り値をチェックし、与えられた@tablenameパラメータに一致する、その後何のテーブルが見つからなかった1を取得する場合。あなたは、アプリケーションにエラーメッセージを与えるためにこれを使用することができます。

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 
しかし、なぜあなたは動的な文字列をbulidingていますか?これは、同じことを行うと動的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