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