У меня проблемы с функциями языка SQL - PullRequest
0 голосов
/ 29 апреля 2019

Я работаю на языке SQL 1 месяц . Вот почему я не могу понять вещи. Но я всегда получаю ошибку при создании этих функций. Я написал коды там. Сообщение об ошибке выглядит следующим образом:

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

CREATE FUNCTION deneme(
    @ID int
)
RETURNS nvarchar(max)
AS
BEGIN
    DECLARE @value nvarchar(max)
    SET @value = (
        SELECT * FROM information
        WHERE @ID = Person_id
    )
    RETURN @value
END

Ответы [ 2 ]

3 голосов
/ 29 апреля 2019

Вы не можете назначить все значения столбцов в одну переменную таким образом, и так как вы передаете ID этого человека, и вы хотите, чтобы ваша функция возвращала информацию об этом человеке

CREATE FUNCTION dbo.deneme
(
  @ID int
)
RETURNS NVARCHAR(300)
AS
BEGIN
  DECLARE @Value NVARCHAR(300) = N'';

  SELECT @Value = CONCAT(I.FirstName, N' ', I.LastName)
  FROM Information I
  WHERE I.PersonId = @ID;

  RETURN @Value;
END
2 голосов
/ 29 апреля 2019

Как уже отмечали другие, вы пытаетесь разместить несколько столбцов / полей в одном столбце / поле.

@ ID - это один столбец.«Select *», по-видимому, возвращает более одного столбца, иначе это не сильно поможет!

Чтобы изменить это и заставить его работать так, как вы пытаетесь здесь, вам нужно объединить столбцыВы пытаетесь вернуться.Это почти наверняка не лучший способ для достижения этой цели, но иногда хорошо подходит объединение имен (например).

Другая проблема, с которой вы можете столкнуться, - это даже если вы изменили это на «Выбрать идентификатор», но все еще имеетеошибки могут быть вызваны тем, что запрос возвращает более одной строки, соответствующей этому критерию.Вы можете обойти эту проблему (это обходится большую часть времени), ограничив число строк, возвращаемых с помощью «TOP 1».Но будьте осторожны, так как это может не вернуть информацию, которую вы хотите.Вы можете использовать оператор order by, чтобы убедиться, что это правильная информация (например, order by Time_entered).

Приведенный ниже код с «TOP 1» и объединением нескольких столбцов (и приведением к типу одного типа) будетвсегда работайте.

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

CREATE FUNCTION deneme(
    @ID int
)
RETURNS nvarchar(max)
AS
BEGIN
    DECLARE @value nvarchar(max)
    SET @value = (
        SELECT TOP 1 cast(First_name as nvarchar) + N' ' + cast(Last_name as nvarchar) FROM information
        WHERE @ID = Person_id
        Order by Time_entered desc
    )
    RETURN @value
END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...