2013-11-29 3 views
0

Что я хочу сделать, это обновить столбец (NewID) в моей таблице (SampleTable) со следующим кодом, но он не работает. Может ли кто-нибудь мне помочь? Что с этим не так?Как обновить поле SQL с помощью функции и хранимой процедуры?

У меня есть таблица «SampleTable», у которой есть поля «NewID» и «OldID».

UPDATE SampleTable SET NewID = dbo.fn_DoStuff(OldID) <-- Not working 

Моя функция:

ALTER FUNCTION [dbo].[fn_DoStuff] 
( 
    @int oldid 
) 
RETURNS int 
AS 
BEGIN 
    DECLARE @returnValue int 
    EXEC @returnValue = dbo.spc_DoStuff @oldid 
    RETURN @returnValue 
END 

Моя хранимая процедура:

SampleTable1 имеет столбцы ID, SomeColName.

ALTER PROCEDURE [dbo].[spc_GeraAtriðisorðalistaÚrAtriðisorði] 
(
    @oldid int 
) 
AS 
BEGIN 
    DECLARE @returnValue int 
    INSERT INTO SampleTable1 (SomeColName) VALUES (null) 
    SET @returnValue = @@IDENTITY 
    INSERT INTO SampleTable2 (SomeColName1, SomeColName2) VALUES (@returnValue, @oldid) 
    SELECT @returnValue AS RetVal 
END 
+0

какая ошибка вы видите? – Tanner

+2

Термин «не работает» слишком расплывчатый. Что это значит? –

+1

Вы можете подумать о добавлении предложения 'where' –

ответ

0

С вашего GarethD решения я еще не мог вызвать функцию, как я хотел

UPDATE SampleTable SET NewID = dbo.fn_DoStuff(OldID). 

Ваш код помог мне хоть начать думать по-другому. Теперь я использую курсор и цикл while, и он работает отлично. См. Мое решение ниже:

DECLARE @OldID AS INT 

DECLARE Upd_CURSOR FOR 
SELECT OldID 
FROM dbo.SampleTable 
WHERE OldID is not null 
FOR UPDATE OF NewID 

OPEN Upd_CURSOR; 
FETCH NEXT FROM Upd_CURSOR INTO @OldID 

WHILE @@FETCH_STATUS = 0 
    BEGIN   
     DECLARE @returnValue int; 
     INSERT INTO SampleTable1 (SomeColName) VALUES (null); 
     SET @returnValue = SCOPE_IDENTITY(); 
     INSERT INTO SampleTable2 (SomeColName1, SomeColName2) VALUES (@returnValue, @OldID) 
     UPDATE dbo.SampleTable SET NewID = @returnValue WHERE CURRENT OF Upd_CURSOR; 
     FETCH NEXT FROM Upd_CURSOR INTO @OldID; 
    END; 
CLOSE Upd_CURSOR; 
DEALLOCATE Upd_CURSOR; 
GO 
2

У вас есть 2 проблемы: во-первых, вы не можете вызывать хранимую процедуру внутри функции и не выполнять свою вставку внутри функции.

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

CREATE TABLE dbo.T (ID INT IDENTITY, Filler CHAR(10)); 
GO 
CREATE PROCEDURE dbo.Test 
AS 
    DECLARE @i INT; 
    INSERT dbo.T (Filler) VALUES (NULL); 
    RETURN SCOPE_IDENTITY(); 
GO 

Обратите внимание на использование в RETURN заявление, если вы не используете этот возврат по умолчанию значение 0

Затем вы можете использовать:

DECLARE @i INT; 
EXECUTE @i = dbo.Test; 
SELECT ReturnVal = @i; 

* Примечание. Я заменил @@ IDENTITY с помощью SCOPE_IDENTITY(), @@ IDENTITY редко используется правильная функция *

Example on SQL Fiddle

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