2012-04-20 4 views
5

Я хочу, чтобы вернуть все имена таблиц из базы данных использовать, но это просто возвращает символпроблема сценария 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 

выход s s s s s s

+2

Если вы объявляете переменную как VARCHAR, вы фактически объявляете VARCHAR (1). Попробуйте VARCHAR (64) или что-то вместо этого. – MatBailie

+2

Почему 'select top 2 table_name из INFORMATION_SCHEMA.TABLES order by table_name asc' не достаточно хорош? – Oded

+0

@Oded: вы не можете «PRINT» создать результирующий набор. Возможно, вам захочется напечатать имя таблицы, а не выбрать ее, если вы пишете скрипт, который выдает другой скрипт в качестве вывода. –

ответ

3
declare @tableName varchar(100) 

Необходимо определить длину имени @tableName, по умолчанию оно установлено в 1 символ.

+0

спасибо человеку простой и объективный – BlaShadow

+0

@BlaShadow приветствуется :) –

+0

Это усекает имена таблиц длиной более 100 символов и не будет содержать символы за пределами текущей кодовой страницы. См. Мой ответ на альтернативу. –

1

попробовать declare @tableName varchar(100)

+3

Это отличается от ответа здесь перед вашим, каким именно образом? Вы добавили слово * Try * в начале? Woot! – MatBailie

+1

Простой вопрос, простой ответ. Вы вводите текст, отправляете его и видите, что три человека избили вас минутой или меньше. Бывает все время. –

+0

Именно то, что сказал Филипп. – JBrooks

1

Вам нужно изменить имя таблицы, чтобы иметь значение для количества символов. В настоящее время это значение по умолчанию равно одному. Я бы предложил гораздо большую ценность, чем вы думаете, что вам нужно обеспечить, чтобы все таблицы соответствовали полям.

1

declare @tableName varchar должен иметь размер как varchar(50)

1

T-SQL имеет тип SYSNAME для хранения вещей, как имена таблиц:

Тип данных SYSNAME используется для столбцов таблицы, переменные, и хранятся параметры процедуры, которые хранят имена объектов. Точное определение sysname связано с правилами для идентификаторов. Следовательно, он может различаться между экземплярами SQL Server. sysname функционально совпадает с как nvarchar (128), за исключением того, что по умолчанию sysname NOT NULL. В более ранних версиях SQL Server sysname определяется как varchar (30).

Так что попробуйте объявить переменную, как это:

DECLARE @tableName SYSNAME; 

Используя VARCHAR(100) декларацию, как это было предложено в других ответах, будет ошибкой, если имя таблицы содержит символы за пределами вашей текущей кодовой страницы или больше, чем 100 персонажи.

Это выдержка из SQL-сервера rules for identifiers описывает форму имени таблицы:

  1. Первый символ должен быть одним из следующих:

    • письмо согласно определению Стандарт Unicode 3.2. Unicode определение букв включает латинские символы от a до z, от от A до Z, а также буквенные символы с других языков.

    • Подчеркнутый знак (_), знак (@) или знак числа (#).

    • Определенные символы в начале идентификатора имеют специальное значение в SQL Server. Обычный идентификатор, начинающийся со знака at , всегда обозначает локальную переменную или параметр и не может использоваться как имя любого другого типа объекта. Идентификатор, начинающийся с знака числа , обозначает временную таблицу или процедуру.Идентификатор, который начинается с двухзначных знаков (##), обозначает глобальный временный объект . Хотя знаки знака числа или двойного номера могут использоваться для начала имен других типов объектов, мы не делаем , рекомендуем эту практику.

    • Некоторые функции Transact-SQL имеют имена, начинающиеся с double при знаках (@@). Чтобы избежать путаницы с этими функциями, вы не должны использовать имена , которые начинаются с @@.

  2. Последующие символы могут включать в себя следующее:

    • письма, как это определено в стандарте Unicode 3.2.

    • Десятичные числа из базовых латинских или других национальных сценариев.

    • Знак at, знак доллара ($), знак числа или символ подчеркивания.

  3. Идентификатор не должен быть зарезервированным словом Transact-SQL. SQL Server хранит как зарезервированные слова в верхнем и нижнем регистре.

  4. Встраиваемые пространства или специальные символы не допускаются.

  5. Дополнительные символы не допускаются.

Смотрите документацию ссылки на мой ответ для получения дополнительной информации.

+0

Это хороший ответ, но я не знаю, почему, но медленнее. – BlaShadow

+0

Тип NVARCHAR использует два байта для представления каждого символа, а тип VARCHAR использует один байт для хранения каждого символа. Если вы имеете дело с большим объемом текстовых данных, вы можете заметить строковые операции с использованием типа NVARCHAR, занимающего больше времени, чем эквивалентные операции VARCHAR. Трудно сказать наверняка, не видя данных, с которыми вы работаете. –

Смежные вопросы