Snowflake cloud data platform 尝试创建函数,但在将其设置为实际返回类型时获取不兼容的数据类型

Snowflake cloud data platform 尝试创建函数,但在将其设置为实际返回类型时获取不兼容的数据类型,snowflake-cloud-data-platform,Snowflake Cloud Data Platform,我试图在我的模式下用雪花创建一个简单的函数。它所做的只是查询一个表 大意是: CREATE FUNCTION MYNEWFUNCTION (DATE_KEY_INPUT INT) RETURNS TABLE (COLUMN1 date, COLUMN2 int, COLUMN3 varchar(255) ) as ' SELECT COLUMN1 ,COLUMN2 ,COLUMN3 FROM "TABLE"."DBO"."TABLENAM

我试图在我的模式下用雪花创建一个简单的函数。它所做的只是查询一个表

大意是:

CREATE FUNCTION MYNEWFUNCTION (DATE_KEY_INPUT INT) 
RETURNS TABLE (COLUMN1 date, COLUMN2 int, COLUMN3 varchar(255) )

as '

SELECT 
COLUMN1
,COLUMN2
,COLUMN3
FROM "TABLE"."DBO"."TABLENAME" 
where column1 = date_key_input
';

但我得到了以下错误:

列“COLUMN3”的声明返回类型“VARCHAR(255)”与实际返回类型“VARCHAR(255)”不兼容

我迷路了。。。它与实际数据类型不兼容?我在这里错过了什么

原始表中的数据类型是varchar(255),在函数中我将其设置为varchar(255)-为什么拒绝


另外,我应该注意到源代码是一个视图而不是一个表,所以具体地说,我正在尝试创建一个函数,该函数从一个视图创建一个表…

在您的示例中发生了一些事情:

  • 第一个问题是定义varchar长度的returns子句,您不需要这个长度
  • 第二个是输入参数/参数没有正确的数据类型,或者 查询构造不正确(col1是date,col2是int)
下面是一个工作示例

CREATE TABLE my_table (col1 date, col2 integer, col3 varchar(255));
INSERT INTO my_table VALUES (current_date(), 1, 'Hello World'),  (current_date(), 2, 'Goodbye');

CREATE OR REPLACE FUNCTION MYNEWFUNCTION (x integer) 
RETURNS TABLE (col1 date, col2 integer, col3 varchar)
as
$$
SELECT col1, col2, col3
FROM my_table 
where col2 = x
$$
;

SELECT * from TABLE(MYNEWFUNCTION(1));
我希望这有助于…Rich


p、 如果这个(或另一个)答案对您有帮助,请花点时间“接受”答案,方法是单击答案旁边的复选标记,将其从“灰显”切换到“已填充”。

雪花中的排序限制:

目前,排序规则和UDF(用户定义函数)并不总是一起工作。例如,不能从UDF返回经过整理的字符串值;服务器抱怨实际返回类型与声明的返回类型不兼容。您也不能将经过整理的字符串值传递给UDF


参考资料:

您能否与我们分享表的
get_ddl
()结果?很抱歉,这一切都是新的-我尝试运行
select get_ddl('view','Database.Schema.table')
但我得到以下错误
SQL编译错误:对象不存在,或者无法执行操作。
只是为了确定-您是这样尝试的,还是使用视图/表的实际名称?请注意,第一个参数应该反映第二个参数是视图还是表。我就是这样尝试的,
'Database.Schema.Table'
实际上是我们环境中的一个视图。因此,在本例中可以忽略命名约定,即表示“表”。感谢Rich的输入,我更改了您提到的所有内容,1。从varchar长度中删除255并简单地使用varchar,现在我得到了列“COLUMN3”的错误
声明的返回类型“varchar(16777216)”与实际返回类型“varchar(255)
我还修复了参数arumge数据类型。原始视图中的第3列有以下详细信息,如果它重要的话
VARCHAR(255)COLLATE'en ci rtrim'
您是否在代码“returns table…”部分更改了它?上面的例子对你有效吗?如果有效,你能检查一下你的例子和你的例子之间的差异吗?