SQL INSERT INTO вместо этого вызывает хранимую процедуру - PullRequest
1 голос
/ 09 ноября 2010

Я хотел бы сделать что-то подобное в SQL

Вставить в сохраненный процесс2 ВЫБЕРИТЕ столбец1, столбец2 из таблицы

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

Ответы [ 5 ]

2 голосов
/ 09 ноября 2010

Ну, как говорили другие, вы не можете сделать это с помощью одного заявления. (это просто так работает)

Если вам не нужно вызывать прок с результатами, вы можете сначала выбрать прокрутку, а затем вызывать прок с помощью курсора. Курсор будет выполнять построчный код, и вы сможете вызывать процедуру, передавая правильные значения. Но остерегайтесь курсоров, которые медленно используют флаги, такие как FAST_FORWARD.

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

Надеюсь, это поможет.

DECLARE CallingProcCursor CURSOR
FAST_FORWARD
FOR 
SELECT database_id,name from sys.databases
DECLARE @database_id int, @name sysname
OPEN CallingProcCursor

FETCH NEXT FROM CallingProcCursor INTO @database_id, @name
WHILE (@@fetch_status <> -1)
BEGIN
    IF (@@fetch_status <> -2)
    BEGIN
        EXEC PROCX @database_id, @name
    END
    FETCH NEXT FROM CallingProcCursor INTO @database_id, @name
END

CLOSE CallingProcCursor
DEALLOCATE CallingProcCursor
GO
1 голос
/ 09 ноября 2010

Вы не можете вставить в хранимую процедуру. Вы можете только вставить в таблицу (и в некоторых случаях представление, в зависимости от платформы БД и того, является ли представление обновляемым.)

Вы можете использовать хранимую процедуру для вставки данных, как показано здесь: http://www.codeproject.com/KB/cs/tariqaziz.aspx

Это не должно быть оскорбительно, но скорее полезно ...

Звучит так, будто вам нужно прочитать о хранимых процедурах, поскольку ваш вопрос показывает, что вы не получаете основ.

http://databases.about.com/od/sqlserver/a/storedprocedure.htm

0 голосов
/ 09 ноября 2010

Нельзя передавать наборы данных хранимым процедурам, только параметры.Вы можете:

  • Передать имя таблицы хранимой процедуре и затем создать выборку.
  • Передать весь запрос в качестве параметра.затем выполните его с sp_executesql.Если вы используете этот метод, вы должны прочитать Проклятие и благословения динамического SQL .
0 голосов
/ 09 ноября 2010

вы можете поместить оператор вставки в хранимый процесс и передать значения в качестве параметров, например,

ниже приведен только пример, в каждой строке вы можете вызвать свой сохраненный процесс, и все должно быть в порядке

 CREATE PROC BDD_AddMessageLogItem(
            @BusinessDevelopmentItemId INT,
            @MessageLog NVARCHAR(MAX), 
            @PostedBy SMALLINT,
            @PostedOfficeId TINYINT,
            @PostedDepartmentId TINYINT,
            @PostedMessageLogType TINYINT)
          AS
     BEGIN

       DECLARE @BusinessDevelopmentMessageLogId SMALLINT





   INSERT INTO dbo.BusinessDevelopmentItemMessageLogs
    ( BusinessDevelopmentItemId ,
      MessageLog , 
      DatePosted,         
      PostedBy,
      PostedOfficeId,
      PostedDepartmentId,
      PostedMessageLogType,
      BusinessDevelopmentMessageLogId
    )
   VALUES  ( @BusinessDevelopmentItemId , -- BusinessDevelopmentItemId - int
      @MessageLog , -- Message - nvarchar(100)          
      GETDATE(),
      @PostedBy, 
      @PostedOfficeId,
      @PostedDepartmentId,
      @PostedMessageLogType,
      @BusinessDevelopmentMessageLogId          
     )
    END
0 голосов
/ 09 ноября 2010

Как сказал Давид, вы не можете делать это так, как хотите.

То, что вы МОЖЕТЕ сделать, это передать хранимую процедуру в качестве параметра и заставить ее выполнять свою логику в каждой строке этой таблицы. Это будет включать в себя некоторый динамический SQL, но это выполнимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...