Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Значение поля как название таблицы  [new]
Proggirl
Member

Откуда:
Сообщений: 101
Здравствуйте. Есть одна мысль, но не знаю можно ли ее осуществить. Она заключается в том , есть таблица Sale.
create table sale
(ID int NOT NULL,
ID_old int NOT NULL,
[table] char [10] NOT NULL,
info  char[200] NOT NULL,
DateOfCustom datetime NOT NULL,
[Count] int NOT NULL,
Price int,
Constraint Primary key PK_Sale([ID]))
нужно использовать поле [table] как название таблицы,пыталась написать триггер на вставку типа:
Update [table]
set [table].[count]=[table].[count]
where [table].ID=ID_Old
конечно же так оно не работает. Но как сделать так, чтобы оно заработало? и возможно ли вообще это осуществить?
7 июн 11, 16:19    [10777653]     Ответить | Цитировать Сообщить модератору
 Re: Значение поля как название таблицы  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
https://www.sql.ru/faq/faq_topic.aspx?fid=104
7 июн 11, 16:23    [10777686]     Ответить | Цитировать Сообщить модератору
 Re: Значение поля как название таблицы  [new]
Proggirl
Member

Откуда:
Сообщений: 101
спасибо
7 июн 11, 16:35    [10777771]     Ответить | Цитировать Сообщить модератору
 Re: Значение поля как название таблицы  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Proggirl,

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

И вот что интересно, SET [table].[count]=[table].[count] вроде как логически ничего не меняет. Правда же?
Однако затрагивает целиком всю таблицу.

Можно использовать одну постоянную таблицу [tab] с дополнительной колонкой, содержащей значение [table].
Тогда в триггере FOR INSERT
update [tab]
set [tab].[count]=[inserted].[count]
from [inserted]
where [tab].[ID]=[inserted].[ID_Old] and [tab].[table]=[inserted].[table]
В смысл самого апдейта я не вникал...
7 июн 11, 16:49    [10777886]     Ответить | Цитировать Сообщить модератору
 Re: Значение поля как название таблицы  [new]
Proggirl
Member

Откуда:
Сообщений: 101
я, оказывается, не до конца дописала
Update [table]
set [table].[count]=[table].[count][b]-count[/b]
where [table].ID=ID_Old
сейчас пытаюсь сделать через динамический запрос
CREATE TRIGGER CountChange
    ON Sale 
     FOR INSERT
  AS
   Declare @ID_old int, @table int, @count int, @SQL varchar(80), @ID int
begin
 set @SQL=' Update dbo.'+@table

exec(@SQL)
set [count]=[count]-@count
where Id=@ID_old
end
Where sale.ID=@ID
но выдает ошибку возле count...
7 июн 11, 17:40    [10778329]     Ответить | Цитировать Сообщить модератору
 Re: Значение поля как название таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104751
Proggirl
но выдает ошибку возле count...

Вы ссылку точно прочитали ?
Динамический запрос - это не макроподстановка в другой запрос
Это полностью правильно написанный запрос
7 июн 11, 17:43    [10778358]     Ответить | Цитировать Сообщить модератору
 Re: Значение поля как название таблицы  [new]
gar
Member

Откуда:
Сообщений: 7955
set @SQL=' Update dbo.'+@table + ' set [count]=[count]-@count where Id=@ID_old'

exec(@SQL)
7 июн 11, 17:46    [10778375]     Ответить | Цитировать Сообщить модератору
 Re: Значение поля как название таблицы  [new]
Proggirl
Member

Откуда:
Сообщений: 101
Glory,

Видно как-то я это пропустила. теперь поняла. спасибо...
7 июн 11, 17:47    [10778381]     Ответить | Цитировать Сообщить модератору
 Re: Значение поля как название таблицы  [new]
flexgen
Member

Откуда: Город на песке
Сообщений: 851
Proggirl
я, оказывается, не до конца дописала
Update [table]
set [table].[count]=[table].[count][b]-count[/b]
where [table].ID=ID_Old
сейчас пытаюсь сделать через динамический запрос
CREATE TRIGGER CountChange
    ON Sale 
     FOR INSERT
  AS
   Declare @ID_old int, @table int, @count int, @SQL varchar(80), @ID int
begin
 set @SQL=' Update dbo.'+@table

exec(@SQL)
set [count]=[count]-@count
where Id=@ID_old
end
Where sale.ID=@ID
но выдает ошибку возле count...


Попробуй обойтись без динамики, что-то вроде этого (код не проверял, вместо Mytable подставь свою таблицу) :

CREATE TRIGGER CountChange
ON Sale 
AFTER INSERT

AS

begin
  Update dbo.Mytable 
  set [count] = b.[count] - a.[count]
  from inserted a
  join dbo.Mytable b
  on a.ID = b.ID
end
7 июн 11, 18:05    [10778513]     Ответить | Цитировать Сообщить модератору
 Re: Значение поля как название таблицы  [new]
Proggirl
Member

Откуда:
Сообщений: 101
Пыталась сделать в триггере, но на таблицу Sale уже есть триггер на добавление. И не выполняется не одно не другое. пытаюсь сделать в хранимой процедуре. тогда выполняется все кроме этого вычитания....
CREATE PROCEDURE dbo.SP_Insert_Sale

AS INSERT INTO dbo.Sale
                      (ID_old,[table],info,DateOfCustom,[Count],Price)
SELECT    ID_old,[table],info,DateOfCustom,[Count],Price
FROM         dbo.Basket
Declare @SQL varchar(80),@count int,@ID_old int, @table int
set @SQL=' Update dbo.'+@table + ' set [count]=[count]-@count where Id=@ID_old'

exec(@SQL)
GO
7 июн 11, 19:41    [10778897]     Ответить | Цитировать Сообщить модератору
 Re: Значение поля как название таблицы  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
Proggirl
Пыталась сделать в триггере, но на таблицу Sale уже есть триггер на добавление. И не выполняется не одно не другое. пытаюсь сделать в хранимой процедуре. тогда выполняется все кроме этого вычитания....
CREATE PROCEDURE dbo.SP_Insert_Sale

AS INSERT INTO dbo.Sale
                      (ID_old,[table],info,DateOfCustom,[Count],Price)
SELECT    ID_old,[table],info,DateOfCustom,[Count],Price
FROM         dbo.Basket
Declare @SQL varchar(80),@count int,@ID_old int, @table int
set @SQL=' Update dbo.'+@table + ' set [count]=[count]-@count where Id=@ID_old'

exec(@SQL)
GO

Приведенный вами код даст ошибку преобразования типов.
7 июн 11, 20:06    [10778943]     Ответить | Цитировать Сообщить модератору
 Re: Значение поля как название таблицы  [new]
Proggirl
Member

Откуда:
Сообщений: 101
Как видите- нет...

К сообщению приложен файл. Размер - 15Kb
7 июн 11, 20:11    [10778955]     Ответить | Цитировать Сообщить модератору
 Re: Значение поля как название таблицы  [new]
flexgen
Member

Откуда: Город на песке
Сообщений: 851
Proggirl
Пыталась сделать в триггере, но на таблицу Sale уже есть триггер на добавление. И не выполняется не одно не другое. пытаюсь сделать в хранимой процедуре. тогда выполняется все кроме этого вычитания....
CREATE PROCEDURE dbo.SP_Insert_Sale

AS INSERT INTO dbo.Sale
                      (ID_old,[table],info,DateOfCustom,[Count],Price)
SELECT    ID_old,[table],info,DateOfCustom,[Count],Price
FROM         dbo.Basket
Declare @SQL varchar(80),@count int,@ID_old int, @table int
set @SQL=' Update dbo.'+@table + ' set [count]=[count]-@count where Id=@ID_old'

exec(@SQL)
GO


Если уж так хочется использовать динамический SQL то во-первых всем переменным надо присвоить какие-либо значения и во-вторых правильно сгенерировать сам запрос
set @SQL=' Update dbo.'+@table + ' set [count] = [count] - ' + cast(@count as varchar) + ' where Id = ' + cast(@ID_old as varchar)
7 июн 11, 20:11    [10778959]     Ответить | Цитировать Сообщить модератору
 Re: Значение поля как название таблицы  [new]
Proggirl
Member

Откуда:
Сообщений: 101
при выполнении процедуры выдает как обычно : успешно выполнена, никаких записей не возвратила...
7 июн 11, 20:12    [10778963]     Ответить | Цитировать Сообщить модератору
 Re: Значение поля как название таблицы  [new]
Proggirl
Member

Откуда:
Сообщений: 101
flexgen,

спасибо. Но оно наверно все таки невидит саму таблицу(для этого мне и нужен динамический запрос как я поняла. как по-другомуиспользовать значение поля как название таблицы?) т.к. не отнимает count...
7 июн 11, 20:21    [10778985]     Ответить | Цитировать Сообщить модератору
 Re: Значение поля как название таблицы  [new]
flexgen
Member

Откуда: Город на песке
Сообщений: 851
Proggirl
Здравствуйте. Есть одна мысль, но не знаю можно ли ее осуществить. Она заключается в том , есть таблица Sale.
create table sale
(ID int NOT NULL,
ID_old int NOT NULL,
[table] char [10] NOT NULL,
info  char[200] NOT NULL,
DateOfCustom datetime NOT NULL,
[Count] int NOT NULL,
Price int,
Constraint Primary key PK_Sale([ID]))
нужно использовать поле [table] как название таблицы,пыталась написать триггер на вставку типа:
Update [table]
set [table].[count]=[table].[count]
where [table].ID=ID_Old
конечно же так оно не работает. Но как сделать так, чтобы оно заработало? и возможно ли вообще это осуществить?


Вот что значит невнимательно прочитать вопрос :-)
Начнем с начала - сколько таблиц и какие мы имеем? Судя по скрипту - sale и table.
Что надо сделать? После вставки записи в таблицу sale необходимо проапдейтить поле count в таблице table?
7 июн 11, 20:37    [10779013]     Ответить | Цитировать Сообщить модератору
 Re: Значение поля как название таблицы  [new]
Proggirl
Member

Откуда:
Сообщений: 101
таблица table может быть разной или Case или SystemBoard и т.д. в зависимости от того, что записано в поле table таблицы sale. суть вообще в том что вы "ходите" по таблицам товаров выбираете товары, добавляете их в таблицу Basket- это по сути корзина. в Basket можно просмотреть будущие "покупки", увеличить количество. если вас все устраивает оформляете заказ( просмотр, печать отчета, все данные из basket копируются в Sale) т.к. я уже не в триггере это делаю. то все необходимые данные будут браться из Basket. после оформления заказа из соответствующей таблицы у соответствующей записи отнимется от общего количества количество купленного товара...
7 июн 11, 21:00    [10779071]     Ответить | Цитировать Сообщить модератору
 Re: Значение поля как название таблицы  [new]
flexgen
Member

Откуда: Город на песке
Сообщений: 851
Proggirl,

То есть без динамики нам не обойтись :-).

create table sale
(ID int identity(1,1) NOT NULL, --генерируем номер строки
ID_old int NOT NULL,
[table] char [10] NOT NULL,
info  char[200] NOT NULL,
DateOfCustom datetime NOT NULL,
[Count] int NOT NULL,
Price int,
Constraint Primary key PK_Sale([ID]))
go

CREATE PROCEDURE dbo.SP_Insert_Sale (@BasketID int) --передаем номер строки из таблицы Basket

AS 

declare @RowID int
Declare @SQL varchar(max)
declare @count int
declare @ID_old int 
declare @table int

--вставляем данные из Basket соответствующие принятому номеру строки
INSERT INTO dbo.Sale (ID_old, [table], info, DateOfCustom, [Count], Price)
SELECT ID_old, [table], info, DateOfCustom, [Count], Price
FROM dbo.Basket
where ID_old = @BasketID

--возвращаем номер строки вставленной в Sale
select @RowID = @@identity

--присваиваем переменным значения полей таблицы sale соответствующие номеру строки 
select @ID_old = ID_old, @table = [table], @count = [count]
from dbo.Sale
where ID = @RowID

--генерируем динамическую команду 
set @SQL = 'Update dbo.' + @table + ' set [count] = [count] - ' + cast(@count as varchar) + ' where Id = ' + cast(@ID_old as varchar)

exec(@SQL)

GO

За точность не ручаюсь, проверь.
7 июн 11, 21:40    [10779208]     Ответить | Цитировать Сообщить модератору
 Re: Значение поля как название таблицы  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3752
Proggirl
после оформления заказа из соответствующей таблицы у соответствующей записи отнимется от общего количества количество купленного товара...

о май гад. Так ведь можно иметь одну таблицу [остатки_товаров] с колонкой [тип_товара] и [остаток] и из нее вычитать. А в таблице [корзина] ссылку на тип_товара. И ВСЕ !
8 июн 11, 00:21    [10779815]     Ответить | Цитировать Сообщить модератору
 Re: Значение поля как название таблицы  [new]
Proggirl
Member

Откуда:
Сообщений: 101
Ivan Durak,

да конечно можно было б и так, но нужно ли? не думаю что кому-либо интересно сколько на складе всего процессоров осталось... А вот сколько осталось i7 920 было б интересно знать, да и докупить малость если кончаются...
10 июн 11, 11:09    [10794232]     Ответить | Цитировать Сообщить модератору
 Re: Значение поля как название таблицы  [new]
Proggirl
Member

Откуда:
Сообщений: 101
flexgen,
спасибо

where ID_old = @BasketID

--возвращаем номер строки вставленной в Sale
select @RowID = @@identity
не совсем поняла зачем нужно это условие. и для чего RowID. пробывала. все равно не работает. Подумала мне бы подошел здесь курсор так как все равно по всем записям Basket нужно пройти.
CREATE PROCEDURE dbo.SP_Insert_Sale
as  
Declare @SQL varchar(150),@count int,@ID_old int, @table int
Declare CountCursor Cursor For
Select ID_old, [count], [table]
From Basket
Open CountCursor
While(@@Fetch_Status<>0)
begin
Fetch next
From CountCursor
into @SQL,@count ,@ID_old, @table 
set @SQL=' Update dbo.'+@table + ' set [count]=[count]-@count where Id=@ID_old &&Curent of{CountCursor}' 

exec(@SQL)
end
Close CountCursor
Deallocate CountCursor
INSERT INTO dbo.Sale
                      (ID_old,[table],info,DateOfCustom,[Count],Price)
SELECT    ID_old,[table],info,DateOfCustom,[Count],Price
FROM         dbo.Basket

GO
После курсора вставка в Sale. После т.к. на Sale
есть триггер на обновление, который удаляет все записи из Basket.
Но все равно не отнимает. не понимаю почему....
10 июн 11, 11:20    [10794339]     Ответить | Цитировать Сообщить модератору
 Re: Значение поля как название таблицы  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Proggirl,

интересно, сколько раз по вашей логике должен выполниться цикл? в динамическом запросе не ругается на переменную @count? почему фетчите 4 значения когда в курсоре объявили три?
10 июн 11, 11:29    [10794441]     Ответить | Цитировать Сообщить модератору
 Re: Значение поля как название таблицы  [new]
Proggirl
Member

Откуда:
Сообщений: 101
SomewhereSomehow,

с курсорами знакома только на теории.Поэтому на примерах возможно не все поняла. исправила. Ошибок вообще никаких не выдает. Процедура выполняется(в Sale записи вставляются) А вот отнимать - не отнимает. С исправлениями:
Declare CountCursor Cursor For
Select ID_old, [count], [table], @SQL
From Basket
Open CountCursor
While(@@Fetch_Status=0)
begin
Fetch next
From CountCursor
into @SQL,@count ,@ID_old, @table 

set @SQL = 'Update dbo.' + @table + ' set [count] = [count] - ' + cast(@count as varchar) + ' where Id = ' + cast(@ID_old as varchar) +'&&Curent of{CountCursor}'
exec(@SQL)
end
Close CountCursor
Deallocate CountCursor
10 июн 11, 11:46    [10794595]     Ответить | Цитировать Сообщить модератору
 Re: Значение поля как название таблицы  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Proggirl,

А теперь сколько раз по вашему мнению выполнится цикл? =)
и потом, у вас в курсоре, какой порядок переменных, а в фетче? что в какую переменную записывается?
хинт: вместо отправки скрипта в exec, сделайте лучше отладочный print.
10 июн 11, 11:51    [10794657]     Ответить | Цитировать Сообщить модератору
 Re: Значение поля как название таблицы  [new]
Proggirl
Member

Откуда:
Сообщений: 101
SomewhereSomehow,

По идее: системная переменная @@Fetch_Status имеет значение "0" в случае успешного выполнения. -1 - если все строки исчерпаны и -2 если данная строка удалена. т.е. цикл должен выполняться до тех пор пока есть записи? возможно я что-то не так сделала....
10 июн 11, 11:56    [10794733]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить