En T-SQL cómo las columnas de visualización de nombre de la tabla dada?
-
25-09-2019 - |
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?
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ámicoNo 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