Frage

Ich versuche, alle Spalten zur Liste von welcher Adventureworks Tabelle I wählen. Was für T-SQL-Anweisung oder gespeicherte Prozedur kann ich ausführen, diese Liste aller Spalten zu sehen? Ich möchte meine C # Web-App zur Eingabe eines Eingabeparameter = table_name verwenden und dann eine Liste aller column_names als Ausgabe zu erhalten. Im Moment bin ich versucht, die sp_columns ausführen gespeicherte Prozedur, die funktioniert, aber ich kann nicht nur die eine Spalte mit select und exec kombiniert bekommen. Weiß jemand, wie dies zu tun?

Vielen Dank allen für Ihre Antworten, aber keine Ihrer Antworten zu tun, was ich brauche. Lassen Sie mich Ihnen mein Problem mehr erklären. Die Abfrage unten zurückkehrt, was ich brauche. Aber mein Problem ist, enthält diese Logik in eine SP, die einen Eingabeparameter. Also hier ist die erfolgreiche SQL-Anweisung:

select col.name from sysobjects obj inner join syscolumns col 
    on obj.id = col.id
    where obj.name = 'AddressType' 
     order by obj.name

Und mein derzeitiger SP sieht aus wie:

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

Aber ich laufe die oben als

exec getColumnNames 'AddressType'

und es gibt mir eine Fehlermeldung:

Invalid column name 'AddressType'

Wie kann ich das erreichen?

War es hilfreich?

Lösung

Sie brauchen nicht die Anweisung als String erstellen - in der Tat, das ist, was Sie up ist in Unordnung. Versuchen Sie folgendes:

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

Andere Tipps

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

Anzeige Info für database.dbo.yourtable dies versuchen:

SELECT
    *
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE 
        TABLE_CATALOG   ='database'
        AND TABLE_SCHEMA='dbo'
        AND TABLE_NAME  ='yourtable'
    ORDER BY ORDINAL_POSITION

Bearbeiten basierend auf OPs bearbeiten

Sie brauchen keine dynamische SQL, benutzen Sie einfach den gegebenen Parameter:

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

Wenn Sie den Rückgabewert überprüfen und 1 erhalten dann wurde keine Tabelle gefunden den gegebenen @TableName Parameter entsprechen. Sie können diese verwenden, um eine Fehlermeldung in der Anwendung zu geben.

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

Mit Remus Rusanu Antwort oder Verwendung SqlConnection.GetSchema() Funktion von C # -Code

Eine Antwort auf Ihre editierten Frage:

Ihr Skript nicht funktioniert, weil Sie einen dynamischen String-Gebäude sind, und innerhalb dieser dynamischen Zeichenfolge müssen Sie Anführungszeichen in die Zeichenfolge hinzufügen, die Sie platzieren in Ihrer where-Klausel. Der überarbeitete Code wäre:

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 

Doch warum sind buliding Sie eine dynamische Zeichenfolge? Dies würde das gleiche tun und erfordert nicht den Aufwand für die dynamische 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 

Wenn Sie über SQL-Injection besorgt sind, ist hier kein Problem -. Entweder obj.name = (was auch immer sie in übergeben wird), oder es funktioniert nicht

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top