Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS SQL Server > взятие таблицы по имени


Автор: Cleric 20.7.2006, 14:40
ситуация такая:

в цикле обрабатываются таблицы с именами имеющими на конце некий номер, (который как раз и меняется)
т.е. например 'dbname.dbo.t1', 'dbname.dbo.t2',...
при этом некоторой переменной @S на каждом этапе цикла присваивается какое то значение из текущей таблицы:
т.е.:
SET @S = (SELECT SUM(x) FROM >?< WHERE ...)
где на месте >?< должна быть соответствующая счетчику цикла таблица

вопрос:
что написать на месте >?<?
или иными словами как обращаться в таких случаях к таблице зная ее имя?

заранее спасибо
 

Автор: HalkaR 21.7.2006, 10:45
Можно попробовать EXEC.Что-то типа
Код

SET @TABLE_NUMBER = 1;
SET @TABLE_NAME = CAST(@TABLE_NUMBER AS VARCHAR(3))
EXEC ('SET @S = (SELECT SUM(x) FROM ' + @TABLE_NAME +' WHERE ...)')

На работоспособность не тестил, но идея такая. 

Автор: Cleric 21.7.2006, 11:11
когда программа пытается выполнить EXEC ('SET @S = (SELECT SUM(x) FROM ' + @TABLE_NAME +' WHERE ...)'), то просит объявить переменную @S

здесь, разумеется, можно сделать все через временную таблицу куда каждый раз будет подобным заливаться текущая таблица (EXEC( 'INSERT INTO #T SELECT * FROM + @TABLE_NAME +' WHERE ...)'), и уже из этой временной таблицы #T, имя которой постоянно, можно брать сумму... но все таки хотелось бы обойтись без лишних наворотов, что б запрос быстрее выполнялся... 

Автор: HalkaR 21.7.2006, 11:12
Cleric, а в чем проблема обьявить @S?

Добавлено @ 11:21 
Кстати можно написать хранимку в которую текстом передвать название и получать воврощаемое значение. 

Автор: Cleric 21.7.2006, 11:22
эээ... вот кусок кода:

Код

DECLARE @S float

exec('SET @S = (SELECT (CASE WHEN Valuta = 0 THEN TotalRUB ELSE TotalUSD END) AS TotalSUM 
FROM ' + @C + ' AS a WHERE a.DocID=-1 AND a.Date1 = ''' + @WhereDate + ''') ')


все равно будет просить объявить @S

или где мне ее объявлять тогда? 


проблема что exec не "видит" объявленную переменную а просто выполняет команду 

Автор: HalkaR 21.7.2006, 11:26
Cleric, да ты прав здесь каша с областями видимости какимито - я не знал такой проблемы

Попробуй вариант с хранимкой.

Добавлено @ 11:27 
Я попробовал вот так smile 
Код

DECLARE @TABLE_NAME AS VARCHAR(20)
SET @TABLE_NAME = '[dbo].[Categories]'
EXEC('DECLARE @S AS INT
SELECT TOP 1 @S=CategoryID FROM ' + @TABLE_NAME +
'SELECT @S')



Добавлено @ 11:28 
Работает, но тебе это надо? 

Автор: Cleric 21.7.2006, 11:30
Цитата(HalkaR @  21.7.2006,  11:12 Найти цитируемый пост)
Кстати можно написать хранимку в которую текстом передвать название и получать воврощаемое значение.  

а как в таком случае будет выглядеть синтаксис того как переменной @S присваивается нужное значение? 
там наверное опять та же проблема возникнет... 

Автор: HalkaR 21.7.2006, 11:46
Мда, задачка ...  smile  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)