2010-04-08 6 views
3

J'essaye d'énumérer toutes les colonnes de n'importe quelle table d'Adventureworks que je choisis. Quelle instruction T-SQL ou procédure stockée puis-je exécuter pour voir cette liste de toutes les colonnes? Je veux utiliser mon application Web C# pour entrer un paramètre d'entrée = nom_table et obtenir une liste de tous les noms_colonnes en sortie. En ce moment j'essaye d'exécuter le proc stocké sp_columns qui fonctionne, mais je ne peux pas obtenir juste la colonne avec select et exec combinés. Est-ce que quelqu'un sait comment faire cela?Dans T-SQL comment afficher les colonnes pour un nom de table donné?

Merci à tous pour vos réponses, mais aucune de vos réponses ne répond à vos besoins. Laissez-moi vous expliquer mon problème plus pour vous. La requête ci-dessous renvoie ce dont j'ai besoin. Mais mon problème est d'incorporer cette logique dans un SP qui prend un paramètre d'entrée. Voici donc l'instruction SQL réussie:

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

Et actuellement mon SP ressemble à:

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 

Mais je lance ci-dessus comme

exec getColumnNames 'AddressType' 

et il me donne l'erreur:

Invalid column name 'AddressType' 

Comment puis-je accom Plaisir ça?

+0

C'est une erreur de syntaxe, voir ma réponse ci-dessous. – egrunin

Répondre

5

Vous n'avez pas besoin de créer l'instruction en tant que chaîne - en fait, c'est ce qui vous embête.Essayez ceci:

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

Génial! Merci beaucoup! C'est la réponse! – salvationishere

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

J'apprécie votre réponse mais pourriez-vous s'il vous plaît voir ma question éditée maintenant? – salvationishere

1

Utilisez Remus Rusanu réponse ou utiliser la fonction SqlConnection.GetSchema() de votre code C#

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

pour afficher les informations pour database.dbo.yourtable essayer ceci:

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

EDIT basé sur modifier OP

Vous ne savez pas besoin sql dynamique, il suffit d'utiliser le paramètre donné:

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 

si vous vérifiez la valeur de retour et obtenir un 1 aucune table n'a été trouvée correspond au paramètre @TableName donné. Vous pouvez l'utiliser pour donner un message d'erreur dans l'application.

1

Une réponse à votre question modifié:

Votre script ne fonctionne pas parce que vous construisez une chaîne dynamique, et dans cette chaîne dynamique, vous devez ajouter des guillemets à la chaîne que vous placez dans votre clause where . Le code révisé serait:

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 

Cependant, pourquoi construisez-vous une chaîne dynamique? Cela ferait la même chose et ne nécessite pas la surcharge de SQL dynamique:

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 

Si vous êtes inquiet au sujet de l'injection SQL, n'est pas un problème - soit obj.name = (tout ce qu'ils passaient dans), ou ce n'est pas le cas.

Questions connexes