Pregunta

Estoy tratando de enumerar todas las columnas de la tabla lo que Adventureworks yo elija. Lo T-SQL declaración o procedimiento almacenado puedo ejecutar para ver la lista de todas las columnas? Quiero usar mi C # aplicación web a la entrada de un parámetro de entrada = nombre_tabla y luego obtener una lista de todos los COLUMN_NAMES como de salida. En este momento estoy tratando de ejecutar las sp_columns proc que trabaja almacenados, pero no puedo conseguir sólo una columna con selecto y exec combinado el. ¿Alguien sabe cómo hacer esto?

Gracias a todos por sus respuestas, pero ninguna de sus respuestas hacen lo que necesito. Me explico mi problema más para usted. La consulta siguiente regresa lo que necesito. Pero mi problema es la incorporación de esta lógica en un SP que toma un parámetro de entrada. Así que aquí está la instrucción SQL éxito:

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

Y en la actualidad mis SP se ve así:

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

Pero corro lo anterior como

exec getColumnNames 'AddressType'

y me da error:

Invalid column name 'AddressType'

¿Cómo lograr esto?

¿Fue útil?

Solución

no es necesario para crear la declaración como una cadena - de hecho, eso es lo que te está arruinando. Prueba esto:

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

Otros consejos

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

a información de visualización para database.dbo.yourtable intente esto:

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

Editar basado en edición de OP

SQL dinámico

No es necesario, sólo tiene que utilizar el parámetro dado:

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 usted comprueba el valor de retorno y obtener un 1, entonces se encontró ninguna tabla coincide con el parámetro @tablename dado. Usted puede usar esto para dar un mensaje de error en la aplicación.

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

Uso Remus Ruşanu función de respuesta o el uso SqlConnection.GetSchema() a partir del código C #

Una respuesta a su Editado pregunta:

Su guión no funciona porque se está construyendo una cadena dinámica, y dentro de esa cadena dinámica debe agregar las cotizaciones a la cadena que está colocando en su cláusula where. El código revisado sería:

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 

Sin embargo, ¿por qué BULIDING una cadena dinámica? Esto haría lo mismo y no requiere la sobrecarga de SQL dinámico:

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 usted está preocupado por la inyección de SQL, no es un problema aquí -. Bien obj.name = (lo que pasó en), o no lo hace

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top