どのように与えられたテーブル名の列を表示するには、T-SQLには?
-
25-09-2019 - |
質問
私は、私が選択したいずれかの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 =、またはそれにはない