2010-11-09 2 views
1

Я хотел бы сделать что-то подобное в SQLSQL INSERT INTO призвании хранимых процедур вместо

Insert Into storedproc2 ВЫБЕРИТЕ column1, COLUMN2 от TABLENAME

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

+0

Отзывы ответили вам? если ответы на них предоставлены, ответили на ваш вопрос, пожалуйста, отметьте один как ответ. –

ответ

1

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

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

Это не означает быть оскорбительным, а полезно ...

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

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

0

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

Что вы можете сделать, это передать сохраненную proc таблицу в качестве параметра и выполнить ее логику для каждой строки в этой таблице. Он будет включать некоторые Dynamic SQL, но это выполнимо.

0

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

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

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

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

  • Передайте имя таблицы хранимой процедуре, а затем постройте выбор.
  • Передайте весь запрос в качестве параметра.

И затем выполнить его с помощью sp_executesql. Если вы используете этот метод, вы должны прочитать The Curse and Blessings of Dynamic SQL.

2

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

Если вы не хотите называть proc с результатами, вы можете сначала выбрать, а затем вызвать proc с помощью курсора. Курсор будет выполнять код строки за строкой, и вы сможете вызвать proc, передавая правильные значения. Но будьте осторожны, что курсоры используются медленно, например, 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

+1 для использования курсора – garik

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