2012-04-20 23 views
5

que desea devolver todos los nombres de las tablas de una base de datos de uso, pero esto acaba de regresar un chartema secuencia de comandos Transact-SQL

declare @contador int 

set @contador = 1 

while (@contador<=(select count(table_name) from INFORMATION_SCHEMA.TABLES)) 
begin 
declare @tableName varchar 
    set @tableName = (select top 1 * from (select top(@contador) table_name from INFORMATION_SCHEMA.TABLES order by table_name asc) as nombre order by table_name desc) 
    print @tableName 
    set @contador = @contador + 1 
end 

la salida es s s s s s s

+2

Si declara una variable como VARCHAR, en realidad está declarando VARCHAR (1). Pruebe VARCHAR (64) o algo en su lugar. – MatBailie

+2

¿Por qué 'select top 2 table_name from INFORMATION_SCHEMA.TABLES order by table_name asc' no es lo suficientemente bueno? – Oded

+0

@Oded: No se puede 'IMPRIMIR' un conjunto de resultados. Es posible que desee imprimir un nombre de tabla en lugar de seleccionarlo si está escribiendo un script que produce otro script como salida. –

Respuesta

3
declare @tableName varchar(100) 

Debe definir la longitud de @tableName, de manera predeterminada tiene 1 carácter.

+0

gracias hombre simple y objetivo – BlaShadow

+0

@BlaShadow de nada :) –

+0

Esto truncará los nombres de tablas de más de 100 caracteres, y no admitirá caracteres fuera de la página de códigos actual. Ver mi respuesta para una alternativa. –

1

tratar declare @tableName varchar(100)

+3

Esto es diferente de la respuesta aquí antes de la suya ¿de qué manera exactamente? Agregaste la palabra * Prueba * al comienzo? ¡WOOT! – MatBailie

+1

Pregunta simple, respuesta simple. Usted ingresa el suyo, lo envía y ve que tres personas lo golpean por un minuto o menos. Pasa todo el tiempo. –

+0

Exactamente lo que dijo Philip. – JBrooks

1

necesita cambiar su nombre de tabla para tener un valor para el número de caracteres. Actualmente ese valor está predeterminado en uno. Sugeriría un valor mucho más grande de lo que cree que necesita para asegurarse de que todas las tablas quepan dentro del campo.

1

declare @tableName varchar necesidades que tienen un tamaño igual varchar(50)

1

T-SQL tiene el tipo SYSNAME para almacenar cosas como nombres de tabla:

El tipo de datos nombre_sist se utiliza para columnas de tablas, variables, y se almacena parámetros de procedimiento que almacenan nombres de objeto. La definición exacta de sysname está relacionada con las reglas para los identificadores. Por lo tanto, puede variar entre instancias de SQL Server. sysname es funcionalmente el mismo como nvarchar (128) excepto que, de forma predeterminada, sysname NO ES NULO. En versiones anteriores de SQL Server, sysname se define como varchar (30).

Así que trate de declarar la variable de la siguiente manera:

DECLARE @tableName SYSNAME; 

Usando la declaración VARCHAR(100), como se sugiere en otras respuestas, se producirá un error si el nombre de la tabla contiene caracteres fuera de la página de códigos actual o es más largo que el 100 caracteres.

Este extracto de SQL Server de rules for identifiers se describe la forma de un nombre de tabla:

  1. El primer carácter debe ser una de las siguientes:

    • Una carta según la definición de la Estándar Unicode 3.2. La definición de letras de Unicode incluye caracteres latinos de la a la z, de de la A a la Z, y también caracteres de letras de otros idiomas.

    • El carácter de subrayado (_), en el signo (@), o el signo de número (#).

    • Ciertos símbolos al principio de un identificador tienen un significado especial en SQL Server. Un identificador regular que comienza con el signo at siempre denota una variable o parámetro local y no se puede utilizar como el nombre de ningún otro tipo de objeto. Un identificador que comienza con un número de indica una tabla o procedimiento temporal.Un identificador que comienza con signos de número doble (##) denota un objeto temporal global . Aunque los caracteres de signo de número o signo de número doble pueden usarse para comenzar los nombres de otros tipos de objetos, no recomendamos esta práctica.

    • Algunas funciones de Transact-SQL tienen nombres que comienzan con el doble en los signos (@@). Para evitar confusiones con estas funciones, no debe usar los nombres que comienzan con @@.

  2. caracteres posteriores pueden incluir lo siguiente:

    • letras como se define en el estándar Unicode 3.2.

    • Números decimales de Basic Latin u otros scripts nacionales.

    • El signo a, el signo de dólar ($), el signo de número o el guión bajo.

  3. El identificador no debe ser una palabra reservada de Transact-SQL. SQL Server se reserva tanto la versión en mayúscula como la minúscula de las palabras reservadas.

  4. No se permiten espacios incrustados ni caracteres especiales.

  5. Los caracteres suplementarios no están permitidos.

Ver los enlaces de documentación en mi respuesta para más información.

+0

es una buena respuesta, pero no sé por qué pero es más lenta – BlaShadow

+0

El tipo NVARCHAR utiliza dos bytes para representar cada carácter, y el tipo VARCHAR usa un byte para almacenar cada carácter. Si está tratando con un gran volumen de datos de texto, puede observar que las operaciones de cadena que utilizan el tipo NVARCHAR tardan más que las operaciones VARCHAR equivalentes. Es difícil de decir con seguridad sin ver los datos con los que está trabajando. –

Cuestiones relacionadas