sql server—创建sql函数以在检查数据时返回一个位

jogvjijk  于 2021-07-27  发布在  Java
关注(0)|答案(2)|浏览(281)

我写了一个sql查询,它工作得很好,但是在转换成函数时遇到了困难,需要一些建议。
下面是sql查询

SELECT
CASE WHEN COUNT(EXPORT_DATE) >=1 AND COUNT(IMPORT_DATE) >=1 AND COUNT(LOCATION)>=1 THEN
CAST (1 AS BIT)
ELSE
CAST (0 AS BIT)
END AS ISTHERE
FROM data_tables
WHERE EXPORT_DATE = '1/1/2020' AND IMPORT_DATE = '1/5/2020' AND LOCATION = 'ENTER LOCATION HERE'

如果在名为isthere的列中满足所有这些条件,则返回1或0
我正试图把它变成一个函数,这样我就可以调用它,并且陷入困境

CREATE FUNCTION duplicate_data (@exportdate date, @importdate date, @location varchar(255))
RETURNS BIT
AS 
BEGIN
SELECT
CASE WHEN COUNT(EXPORT_DATE) >=1 AND COUNT(IMPORT_DATE) >=1 AND COUNT(LOCATION)>=1 THEN
CAST (1 AS BIT)
ELSE
CAST (0 AS BIT)
END AS ISTHERE
FROM data_tables
WHERE EXPORT_DATE = '1/1/2020' AND IMPORT_DATE = '1/5/2020' AND LOCATION = 'ENTER LOCATION HERE'
RETURN ISTHERE
END

我有两个错误
函数中包含的select语句不能将数据返回给客户端
无效的列名=isthere
对于编写函数还是新手,我的语法哪里不正确?
这是针对microsoft sql server的,必须满足所有3个条件。
非常感谢
大明Pig

xam8gpfp

xam8gpfp1#

这两个错误都说明了问题所在:
函数中包含的select语句不能将数据返回给客户端
你有一个标量函数,所以,正如错误告诉你的,你不能有一个标量函数 SELECT 将数据返回给客户端。
无效的列名=isthere
在声明中 RETURN ISTHEREISTHERE 没有上下文,因此出现错误。
标量函数与用于返回的变量一起工作,因此实际需要的是:

CREATE FUNCTION dbo.duplicate_data (@exportdate date, @importdate date, @location varchar(255))
RETURNS BIT
AS 
BEGIN
    DECLARE @IsThere bit;
    SET @IsThere = (SELECT CASE WHEN COUNT(EXPORT_DATE) >=1 AND COUNT(IMPORT_DATE) >=1 AND COUNT(LOCATION)>=1 THEN CAST(1 AS BIT)  
                                                                                                              ELSE CAST(0 AS BIT)
                           END
                    FROM dbo.data_tables
                    WHERE EXPORT_DATE = @exportdate
                      AND IMPORT_DATE = @importdate
                      AND LOCATION = @location)
    RETURN @IsThere;
END;
vuv7lop3

vuv7lop32#

因为你的 where 条件下,您可以将查询大大简化为:

select (case when count(*) >= 1 then 1 else 0 end)
from dbo.data_tables
where EXPORT_DATE = @exportdate and
      IMPORT_DATE = @importdate and
      LOCATION = @location;

然后可以将其作为标量内联函数编写:

CREATE FUNCTION duplicate_data (
    @exportdate date,
    @importdate date,
    @location varchar(255)
)RETURNS BIT
AS 
    RETURN (select convert(bit, (case when count(*) >= 1 then 1 else 0 end))
            from dbo.data_tables
            where EXPORT_DATE = @exportdate and
                  IMPORT_DATE = @importdate and
                  LOCATION = @location
           );

相关问题