Обмен SQL-запрос для хранимой процедуры и путают о возвращаемом значении - PullRequest
0 голосов
/ 02 октября 2009

Это фрагмент кода на одной из страниц, которые я просматриваю и пытаюсь обновить. То, что я пытаюсь сделать, это заменить встроенный запрос для хранимых процедур. Это бит кода:

numOfDelRec = 1
Do While (numOfDelRec > 0)
cm.CommandText = "DELETE Folder WHERE FolderID IN 
    (SELECT ch.FolderID FROM Folder ch 
    LEFT JOIN Folder p ON ch.ParentID=p.FolderID " & _
    "WHERE p.FolderID IS NULL AND ch.ParentID > 0) 
    AND UserID=" & Session("UserID")
cm.Execute numOfDelRec
Loop

Что меня интересует, так это то, что значение numOfDelRec возвращается и используется для продолжения зацикливания. Как я могу сделать то же самое с хранимой процедурой, учитывая, что хранимая процедура в основном такая же, как встроенная sql?

Это мой вызов хранимой процедуры:

AuthConn.Execute("sp_MyFolder_DeleteFolder " & Session("UserID"))

Это Microsoft SQL Server 2005.

Спасибо, Р.

Ответы [ 4 ]

1 голос
/ 02 октября 2009

Прежде всего: не называйте эту хранимую процедуру как

sp_

. «sp» означает «специальная процедура», и - в SQL Server - все процедуры, начинающиеся с «подчеркивания sp» [ переполнение стека действительно , не хотят, чтобы я вводил символ подчеркивания где мне нужно ] получить специальную обработку. Есть времена и места для выполнения процедур sp_ [ хах, тогда это работало ], но это не похоже на один из них. Подробнее об этом читайте в SQL Books Online - это сложная концепция; на данный момент я бы вызвал процедуру «MyFolderDeleteFolder» или «usp_MyFolder_DeleteFolder» [ черт с ней, пожалуйста, представьте, что подчеркивания находятся там, где они должны быть ], если у вас есть полупервентное соглашение об именах.

Переходя от этого искаженного предостережения, вот как я перенесу эту команду в процедуру. (Я не могу проверить это сейчас, может потребоваться небольшая отладка, и я бы хотел превратить LOJ в НЕ СУЩЕСТВУЮЩИЙ):

CREATE PROCEDURE MyFolder_DeleteFolder

    @UserId  int

AS

SET NOCOUNT on

DECLARE @RowsDeleted int
SET @RowsDeleted = 1

WHILE @RowsDeleted > 0
 BEGIN
    --  Loop until a call to DELETE does not delete any rows
    DELETE Folder
     WHERE FolderID IN 
        (SELECT ch.FolderID
          FROM Folder ch 
           LEFT JOIN Folder p
            ON ch.ParentID = p.FolderID 
          WHERE p.FolderID IS NULL
           AND ch.ParentID > 0) 
        AND UserID = @UserID

    SET @RowsDeleted = @@rowcount
 END

RETURN 0
0 голосов
/ 02 октября 2009

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

Если это так, то метод ExecuteNonQuery возвращает количество затронутых строк.

Попытка:

cm.CommandType = CommandType.StoredProcedure;
cm.CommandText = "ProcName"

numOfDelRec = 1
Do While (numOfDelRec > 0)
    numOfDelRec = cm.ExecuteNonQuery()
Loop
0 голосов
/ 02 октября 2009

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

AuthConn.Execute("sp_MyFolder_DeleteFolder " & Session("UserID"),numOfDelRec)

http://www.devguru.com/technologies/ado/quickref/connection_execute.html

0 голосов
/ 02 октября 2009

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

Вероятно, это циклы, поэтому если родительская запись не имеет дочерних элементов, она удаляется. Однако если он сам был дочерним, его родительская запись не была удалена на первом проходе, но будет перехвачена на втором проходе и т. Д.

Вы не упомянули вид используемого вами сервера базы данных, но с сервером sql вы можете выполнить цикл while, который описан здесь по адресу MSDN http://msdn.microsoft.com/en-us/library/ms178642.aspx Это, вероятно, сработает.

Я не уверен, что это именно то, о чем вы просите, но я верю, что именно это делает код.

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