我在使用sql语言功能时遇到问题

时间:2019-04-29 18:06:43

标签: sql sql-server tsql

我已经使用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 个答案:

答案 0 :(得分:3)

您不能像这样将所有列的值分配给一个变量,并且由于您要传递一个人的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

答案 1 :(得分:1)

正如其他人指出的那样,您正在尝试在单个列/字段中放置多个列/字段。

@ID是单列。 “ Select *”可能返回的不仅仅是单个列,否则不会有太大帮助!

为了更改它并使它在您尝试此处工作时,您需要合并要尝试返回的列。这几乎肯定不是实现此目的的最佳方法,但是有时使用简短的名称(例如)是可以的。

您可能遇到的另一个问题是即使您将其更改为“选择ID”,但仍然存在错误,这可能是因为查询返回的多个行符合该条件。您可以通过限制用“ TOP 1”返回的行数来解决此问题(大部分时间都是这样)。但是要小心,因为这可能不会返回您想要的信息。您可以使用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