Question

Je suis en train d'énumérer toutes les colonnes de la table selon Adventureworks je choisis. Quel énoncé T-sql ou proc stocké puis-je exécuter pour voir la liste de toutes les colonnes? Je veux utiliser mon C # application Web à l'entrée un paramètre d'entrée = table_name puis obtenir une liste de tous les column_names en sortie. En ce moment je suis en train d'exécuter les sp_columns stockées proc qui fonctionne, mais je ne peux pas juste une colonne avec sélection et exec combiné. Quelqu'un sait-il comment faire?

Merci à tous pour vos réponses, mais aucune de vos réponses font ce que j'ai besoin. Permettez-moi d'expliquer mon problème plus pour vous. La requête renvoie ci-dessous ce que je dois. Mais mon problème intègre cette logique dans un SP qui prend un paramètre d'entrée. Voici donc le succès instruction SQL:

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 y parvenir?

Était-ce utile?

La solution

Vous n'avez pas besoin de créer la déclaration en tant que chaîne - en fait, c'est ce qui vous chambouler. 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

Autres conseils

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

pour afficher les informations pour database.dbo.yourtable essayez 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 la modification de l'OP

Vous n'avez 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 @Rows=@@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.

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

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

Une réponse à modifié Question:

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 êtes-vous Buliding 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 ne pas

.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top