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

Откуда:
Сообщений: 6
Доброго дня.

Помогите, пожалуйста, новичку. Осваиваю написание функции и не могу понять, почему SQL ругается на следующий запрос,
где я хочу вставить юзера, если он уникальный и вернуть ID соответствующей записи:

CREATE FUNCTION Insert_User 
(	
	@UserName nvarchar(15),
	@ComputerName nvarchar(15)
)
RETURNS INT
AS
BEGIN
	DECLARE @UserId int;
	SELECT @UserId = ID FROM db_ogt.dbo.Users WHERE Name = @UserName AND Computer = @ComputerName;	
		IF (@UserId = null)				
			BEGIN
			INSERT db_ogt.dbo.Users(Name, Computer) VALUES(@UserName, @ComputerName);
			SET @UserId = SCOPE_IDENTITY();
			END	
	RETURN (@UserId)
END
GO


В частности, говорит, что "недопустимое использование оператора INSERT, оказывающее побочное действе, в функции".

INSERT использовать в функциях запрещено чтоли? Или у меня с синтаксисом что-то не так?

Заранее спасибо.
3 фев 16, 16:26    [18768441]     Ответить | Цитировать Сообщить модератору
 Re: Использование Insert в функции  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
и откуда вы такие берётесь? msdn (bol) читайте сначала, а потом уже пишите sql
3 фев 16, 16:27    [18768449]     Ответить | Цитировать Сообщить модератору
 Re: Использование Insert в функции  [new]
Glory
Member

Откуда:
Сообщений: 104760
Kamerton440
INSERT использовать в функциях запрещено чтоли?

что ли
Kamerton440
Или у меня с синтаксисом что-то не так?

Сообщение о неправильном синтаксисе выглядит по-другому
3 фев 16, 16:35    [18768528]     Ответить | Цитировать Сообщить модератору
 Re: Использование Insert в функции  [new]
Kamerton440
Member

Откуда:
Сообщений: 6
Glory
что ли

Спасибо)
3 фев 16, 16:46    [18768606]     Ответить | Цитировать Сообщить модератору
 Re: Использование Insert в функции  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
Kamerton440 пробуйте такой вариант и не надо харкодить имя БД в коде:

USE db_ogt
GO

CREATE PROCEDURE dbo.usp_GetUserID
(
	@UserName NVARCHAR(15),
	@ComputerName NVARCHAR(15)
	@UserId INT OUTPUT
)
AS BEGIN

	SET NOCOUNT ON;

	SET @UserId = NULL

	SELECT TOP(1) @UserId = ID
	FROM dbo.Users
	WHERE Name = @UserName
		AND Computer = @ComputerName	

	IF @UserId IS NULL BEGIN

		INSERT INTO dbo.Users (Name, Computer)
		VALUES (@UserName, @ComputerName)

		SET @UserId = SCOPE_IDENTITY()

	END

END
3 фев 16, 17:07    [18768844]     Ответить | Цитировать Сообщить модератору
 Re: Использование Insert в функции  [new]
invm
Member

Откуда: Москва
Сообщений: 9405
Kamerton440
INSERT использовать в функциях запрещено чтоли?
Ну вот вы и сюда добрались, поздравляю. Как ваши коллеги? Не возмущаются, что вы столь часто узурпируете доступ в интернет?

Если бы вы еще утром потратили некоторое время на чтение документации по CREATE FUNCTION, давно бы уже нашли ответ на свой вопрос. Но вам же не удобно самому искать информацию, не правда ли?
3 фев 16, 17:27    [18769019]     Ответить | Цитировать Сообщить модератору
 Re: Использование Insert в функции  [new]
Kamerton440
Member

Откуда:
Сообщений: 6
AlanDenton
Kamerton440 пробуйте такой вариант и не надо харкодить имя БД в коде


Спасибо, учту ваши замечания) Да, вчера переписал под процедуру, когда заметил, что они тоже могут возвращать значения...

[quot invm]
Kamerton440
Если бы вы еще утром потратили некоторое время на чтение документации по CREATE FUNCTION...

Вы можете мне как всегда не верить и считать кем хотите - ваше право, но вот эта строчка действительно мне помогла. Ну недотупил я вчера поискать именно "CREATE FUNCTION" в поиске и зарылся в документации на час, так ничего вразумительного и не найдя. Благодаря этому посту набрёл на то, что вы, видимо, пытались до меня донести вчера, в частности:

Before You Begin

Limitations and Restrictions

User-defined functions cannot be used to perform actions that modify the database state

Надеюсь, другим новичкам поможет.
4 фев 16, 09:00    [18770988]     Ответить | Цитировать Сообщить модератору
 Re: Использование Insert в функции  [new]
Glory
Member

Откуда:
Сообщений: 104760
Kamerton440
Надеюсь, другим новичкам поможет.

Не поможет
Они же не будут делать поиск по форуму. А сразу новую тему создадут.
4 фев 16, 09:41    [18771153]     Ответить | Цитировать Сообщить модератору
 Re: Использование Insert в функции  [new]
Andraptor
Member

Откуда: Ukraine, Kharkiv
Сообщений: 291
И вообще, multistatement functions (это те, в которых есть BEGIN...END, и не важно, скалярные они или табличные) - это плохо.
Лучше сразу отказаться от их использования, что бы в будущем не было проблем с производительностью.
4 фев 16, 10:16    [18771287]     Ответить | Цитировать Сообщить модератору
 Re: Использование Insert в функции  [new]
Kamerton440
Member

Откуда:
Сообщений: 6
Andraptor
И вообще, multistatement functions (это те, в которых есть BEGIN...END, и не важно, скалярные они или табличные) - это плохо.
Лучше сразу отказаться от их использования, что бы в будущем не было проблем с производительностью.


Спасибо. Учту.
4 фев 16, 10:50    [18771457]     Ответить | Цитировать Сообщить модератору
 Re: Использование Insert в функции  [new]
Подленько так
Guest
Можно ли выполнять INSERT в UD Function?
4 фев 16, 16:40    [18773558]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить