@ellz

Почему не обновляется процедура?

Есть такая процедура:
CREATE PROCEDURE [dbo].[AddHotel]
	@adress nvarchar,
	@rating int,
	@name nvarchar,
	@line int,
	@distanceToBeach int, 
	@distanceToAirport	INT,
	@cityName nvarchar
AS
BEGIN
DECLARE @CityID int
set @CityID = (SELECT Cities.Id FROM dbo.Cities WHERE Cities.Name = @cityName)

	INSERT INTO [dbo].[Hotels]
           ([Name],[Address],[Rating], [DistanceToBeach], [DistanceToAirport], [Line], [Discription])
     VALUES
           (@name, @adress, @rating, @distanceToBeach, @distanceToAirport, @line, 'some discr')
END

Если ее оставить такой, то запрос cityId вернет null. Если сделать так:
SELECT Cities.Id FROM dbo.Cities WHERE Cities.Name = N'Название города'
, то-есть вернет id как нужно.
Но я то данные для выборки беру из входного параметра.
Решил сделать так:
set @CityID = (SELECT Cities.Id FROM dbo.Cities WHERE Cities.Name = N(@cityName))

И получаю ошибку обновления процедуры -
An error occurred while the batch was being exxecuted

Cities.Name - имеет тип nvarchar
  • Вопрос задан
  • 57 просмотров
Решения вопроса 1
tsklab
@tsklab Куратор тега Transact-SQL
Здесь отвечаю на вопросы.
У вас не указана размерность входных параметров NVARCHAR.
Указал - не помогло.
Проверьте входное значение.
Конечно нужно использовать отладчик. Сермяжная проверка:
DECLARE @cityNameTest nvarchar(100)
SET @cityNameTest = N'Название города'
SELECT 1 WHERE @cityName = @cityNameTest


N перед параметром означает не UNICODE, а функцию, а чём указано в ошибке.

Если неопределённость осталась, нужно смотреть параметры сортировки Cities.Name, который влияет на сравнение строк. COLLATE.

Дополнение. Поскольку вы передаёте город не кодом, а названием, нужно обрабатывать его отсутствие в базе:
SELECT @CityID = Id FROM Cities WHERE [Name] = @cityName
IF @CityID IS NULL BEGIN
  INSERT Cities([Name]) VALUE (@cityName)
  SET @CityID = IDENT_CURRENT('Cities')
END

В INSERT [Hotels] нет поля кода города.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы