Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Можно ли написать такую процедуру?  [new]
igor888
Guest
Добрый день.

Есть 4-ре таблицы с одинаковой структурой данных. Написал алгоритм заполнения, обернул в процедуру.
Вопрос, можно ли написать процедуру таким образом, чтоб одним из параметров выступала таблица, которую необходимо заполнять?

что-то типа такого:

CREATE PROCEDURE [SAL_PerformPayrollForService]
  @TableName	SYSNAME,
  @Transactions	SAL_R_PerformPayrollService READONLY -- если что, переменная табличного типа))
AS
SET NOCOUNT ON;

BEGIN TRY
  INSERT INTO /*[SAL_DOCS_ServicesSeller]*/ @TableName ([TransactionServiceKey], [SalaryKey], [Wages], [HistoryPercentService],    [IsFixSum], [Description])
  SELECT
  ...
  ...
  FROM Transactions	
3 июн 15, 10:05    [17723704]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли написать такую процедуру?  [new]
Glory
Member

Откуда:
Сообщений: 104760
igor888
Вопрос, можно ли написать процедуру таким образом, чтоб одним из параметров выступала таблица, которую необходимо заполнять?

Именно таблица? Или имя таблицы ?
3 июн 15, 10:08    [17723721]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли написать такую процедуру?  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
ALTER PROCEDURE [SAL_PerformPayrollForService]
(
	@TableName SYSNAME,
	@Transactions SAL_R_PerformPayrollService READONLY
)
AS BEGIN

	SET NOCOUNT ON;

	IF @TableName = 'table1' BEGIN

		INSERT INTO dbo.table1...

	END
	ELSE IF @TableName = 'table2' BEGIN

		INSERT INTO dbo.table2...

	END
	ELSE IF ....

END
GO


Такой вариант сойдет?
3 июн 15, 10:09    [17723729]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли написать такую процедуру?  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
Если такой вариант "нахрапом" немного не то что хотелось бы - выход в использовании динамического SQL + передача этой переменной как параментра в sp_executesql
3 июн 15, 10:14    [17723751]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли написать такую процедуру?  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
igor888, ну FAQ же.
3 июн 15, 10:16    [17723761]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли написать такую процедуру?  [new]
igor888
Guest
AlanDenton
Если такой вариант "нахрапом" немного не то что хотелось бы - выход в использовании динамического SQL + передача этой переменной как параментра в sp_executesql


Спасибо, конечно, но это и я могу сделать.

Пример я написал в очень простой форме, в запросе идёт много расчётов в зависимости от параметров переданных в переменной табличного типа и первый Ваш совет - это дублирование sql-кода, который собственно и не хочу тиражировать, а применение sp_executesql очень криво (это моё мнение)
3 июн 15, 10:21    [17723793]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли написать такую процедуру?  [new]
igor888
Guest
Minamoto
igor888, ну FAQ же.


Других вариантов я полагаю нет?
3 июн 15, 10:23    [17723806]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли написать такую процедуру?  [new]
Glory
Member

Откуда:
Сообщений: 104760
igor888
Других вариантов я полагаю нет?

Сделать одну таблицу, а не четыре
3 июн 15, 10:25    [17723813]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли написать такую процедуру?  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
Очень сомневаюсь что существуют другие варианты. Так что придется довольствоваться тем что есть. Дублирование кода или sp_executesql. Tertium non datur :)
3 июн 15, 10:25    [17723814]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли написать такую процедуру?  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
Кстати, а зачем Вам 4 таблицы с одинаковой структурой? Glory по сути прав...
3 июн 15, 10:27    [17723823]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли написать такую процедуру?  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
igor888, есть, объединить таблицы с одинаковой структурой в партиционированное представление, и вставлять данные в него, например.

https://www.simple-talk.com/sql/sql-tools/sql-server-partitioning-without-enterprise-edition/
3 июн 15, 10:47    [17723961]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли написать такую процедуру?  [new]
Mikle83
Member

Откуда: Санкт-Петербург
Сообщений: 630
ТС, завяжите процедуру не на таблицу а на представление (условно My_View1 с тривиальным селектом
Select * from Table1 
.
Для процедуры сделайте обертку с входным параметром - имя таблицы, в рамках обертки перед вызовом основной процедуры - пересоздавайте представление на нужную таблицу:
Create procedure ExecuterOfMainProcedure
@TableName varchar(100)
as
begin
Drop view My_View1
..................
exec ('Create My_View1 as Select * from ' + @TableName 
................
exec MainProcedure


Обойдетесь в итоге без динамических запросов
3 июн 15, 11:09    [17724114]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли написать такую процедуру?  [new]
igor888
Guest
Glory,

Если б было так всё просто как "чёрное и белое", была бы одна таблица, но в структуре данных куча нюансов как "все цвета радуги", подчинёны таблицы имеют разную структуру. А если и дальше советовать, то придётся подгонять под общую структуру и подчинённые таблицы как следствие одна большая куча "Г" и г-образные запросы для отчётности например))) Это уже не мой подход...
3 июн 15, 11:48    [17724393]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли написать такую процедуру?  [new]
Glory
Member

Откуда:
Сообщений: 104760
igor888
Если б было так всё просто как "чёрное и белое", была бы одна таблица, но в структуре данных куча нюансов как "все цвета радуги", подчинёны таблицы имеют разную структуру. А если и дальше советовать, то придётся подгонять под общую структуру и подчинённые таблицы как следствие одна большая куча "Г" и г-образные запросы для отчётности например))) Это уже не мой подход...

С чего вдруг подчиненные таблицы должны стать тоже одинаковой структуры, если они уже имеют разную структуру ?

Зачем вы тогда спрашиваете по еще какие-то варианты, если вы не готовы что-то менять ?
3 июн 15, 11:51    [17724411]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли написать такую процедуру?  [new]
igor888
Guest
Mikle83
ТС, завяжите процедуру не на таблицу а на представление (условно My_View1 с тривиальным селектом
Select * from Table1 
.
Для процедуры сделайте обертку с входным параметром - имя таблицы, в рамках обертки перед вызовом основной процедуры - пересоздавайте представление на нужную таблицу:
Create procedure ExecuterOfMainProcedure
@TableName varchar(100)
as
begin
Drop view My_View1
..................
exec ('Create My_View1 as Select * from ' + @TableName 
................
exec MainProcedure


Обойдетесь в итоге без динамических запросов


Спасибо за совет.

Решил сделать след. образом.
В процедуре создать временную таблицу, заполнить её грамоским расчётом, а затем приметь Insert для той таблицы, которой это предназначается. Всё банально просто))).

Спасибо всем, вопрос закрыт
3 июн 15, 11:52    [17724419]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли написать такую процедуру?  [new]
Glory
Member

Откуда:
Сообщений: 104760
igor888
В процедуре создать временную таблицу, заполнить её грамоским расчётом

И как вы узнаете, по какой из 4х таблиц делать "грамоский расчёт" ?
3 июн 15, 11:53    [17724433]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли написать такую процедуру?  [new]
igor888
Guest
Glory,

я имел ввиду ещё советы но без изменения структуры данных.
3 июн 15, 11:53    [17724434]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли написать такую процедуру?  [new]
igor888
Guest
Glory
igor888
В процедуре создать временную таблицу, заполнить её грамоским расчётом

И как вы узнаете, по какой из 4х таблиц делать "грамоский расчёт" ?


как то так

CREATE PROCEDURE [SAL_PerformPayrollForService]
  @CodeRole		INT,
  @Transactions	SAL_R_PerformPayrollService READONLY
AS
SET NOCOUNT ON;

BEGIN TRY
  DECLARE @t TABLE(
    [TransactionKey]		INT PRIMARY KEY,
    [SalaryKey]				INT NOT NULL,
    [Wages]					MONEY NOT NULL,
    [HistoryPercentService]	MONEY NOT NULL,
    [IsFixSum]				BIT NOT NULL,
    [Description]			NVARCHAR(128)
  );
    
  INSERT INTO @t ([TransactionKey], [SalaryKey], [Wages], [HistoryPercentService], [IsFixSum], [Description])
  SELECT
    [TransactionKey],
    [SalaryKey],
    ...
    ...

  FROM @Transactions

  IF @CodeRole = 1
    INSERT INTO [SAL_DOCS_ServicesSeller] ([TransactionServiceKey], [SalaryKey], [Wages], [HistoryPercentService], [IsFixSum], [Description])
      SELECT * FROM @t
3 июн 15, 12:00    [17724483]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли написать такую процедуру?  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4248
igor888
...грамоским ...

это вообще ни в какие рамки!!!

громоздким
3 июн 15, 12:20    [17724621]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли написать такую процедуру?  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4248
igor888
Glory,

я имел ввиду ещё советы но без изменения структуры данных.


Еще вариант - заполнять данными одну вспомогательную (временную) таблицу или внутреннюю табличную переменную,
а потом делать динамический запрос с подстановкой имени таблицы из параметра.
Впрочем, это будет не намного проще обычного динамического запроса.
3 июн 15, 12:24    [17724660]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли написать такую процедуру?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
SQL2008
igor888
...грамоским ...

это вообще ни в какие рамки!!!

громоздким


кто знает... может именно "грамоским", от слова "грамотный"+"моск", то есть, четким грамотным продуманным отчетом.
3 июн 15, 13:09    [17724937]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли написать такую процедуру?  [new]
samoxod
Member

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

CREATE SYNONIM ?
3 июн 15, 14:05    [17725397]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли написать такую процедуру?  [new]
igor888
Guest
SQL2008,

Молодец! Оправдания мне нет)))

Но думаю на поиск таких ошибок Вы выбрали не тот форум.
Как писал выше, вопрос закрыт!
3 июн 15, 14:16    [17725465]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить