带有 --comments 的 SAS 显式传递转换为单行
SAS explicit pass-through with --comments converts to single line
似乎在使用 SAS 执行显式传递时,文本不会以与在编辑器或 .sas 文件本身中布局相同的方式传送到服务器。 SAS 似乎在一行中传递所有文本。
当您使用 --comments.
传递查询时,这会出现问题
示例:
以下代码将 "flattened" 在 PROC SQL 显式传递中:
SELECT * --this is my comment
FROM myTable
WHERE
1 = 1
服务器会这样接收:
SELECT * --this is my comment FROM myTable WHERE 1 = 1
如您所见,评论破折号后的所有内容都是....已评论。
是否有人知道可以与 PROC SQL 一起使用以确保不会发生这种情况的特殊选项或配置?我知道使用 SAS,这些评论中的每一个都可以转换为:
/*comments like this*/
但是为了这个问题,我们假设这不是一个选项,并且有必要在代码中维护 --注释。
编辑:我应该注意,我正在对 IBM Netezza 数据库执行此显式传递。
我认为这根本不是 SAS 问题,而是 ODBC 驱动程序问题。
我能够将针对 ODBC 连接的问题复制到 mySQL 数据库,并且还使用来自 SAS 以外的程序的相同 ODBC 连接复制问题。
在 proc SQL 中似乎没有记录的选项可以执行此操作。您可以尝试询问SAS技术支持,看他们有什么建议。
我自己的建议是对查询字符串应用正则表达式替换,以在通过直通提交之前删除任何评论。
粘贴到 Whosebug 时字符串如何突出显示无关紧要。这是数据库在收到该字符串时所做的事情。它是否将双连字符视为减去某些前缀有否定运算符的值的尝试?还是将其视为行尾注释?
至少对于 Teradata,数据库将 --
识别为注释的开始,但由于它只获得一行代码,因此它注释掉了所有其余代码。
70 select * from connection to td
71 (select 1+2 -- Comment in line
72 +3 as name
73 , 4+5 as value
74
75 )
76 ;
TERADATA_0: Prepared: on connection 0
select 1+2 -- Comment in line +3 as name , 4+5 as value
所以它运行没有错误,但它只是 returns 单个值 3,因为它是 1 和 2 的总和。
另请注意,在 SAS 中 --
没有特殊含义。只是两个 -
相邻。试试这个查询,您会看到 X 与 AGE 具有相同的值。
select name,age,--age as x
from sashelp.class
;
要么使用带有行尾注释的源代码在数据库中创建一个可以从 SAS 调用的存储过程,要么在将行尾注释包含在 PROC SQL 代码中之前将其删除。
好吧,我真的不想在 SO 上回答我自己的问题,但这是 SAS 技术支持 (support@sas.com) 的官方回答:
Hello Joshua, I did some additional checking on this. Unfortunately
SAS does not preserve the line breaks as you have noticed.
Additionally the SAS/ACCESS engine does not have a function such as
PRESERVE_COMMENTS seen in the Oracle engine. There is no real way to
force this to be passed with the line breaks. The block comments will
be the next best option. I am sorry for the inconvenience. Please
let me know if there are any questions or concerns.
Thank you,
Sean
似乎在使用 SAS 执行显式传递时,文本不会以与在编辑器或 .sas 文件本身中布局相同的方式传送到服务器。 SAS 似乎在一行中传递所有文本。
当您使用 --comments.
传递查询时,这会出现问题示例:
以下代码将 "flattened" 在 PROC SQL 显式传递中:
SELECT * --this is my comment
FROM myTable
WHERE
1 = 1
服务器会这样接收:
SELECT * --this is my comment FROM myTable WHERE 1 = 1
如您所见,评论破折号后的所有内容都是....已评论。
是否有人知道可以与 PROC SQL 一起使用以确保不会发生这种情况的特殊选项或配置?我知道使用 SAS,这些评论中的每一个都可以转换为:
/*comments like this*/
但是为了这个问题,我们假设这不是一个选项,并且有必要在代码中维护 --注释。
编辑:我应该注意,我正在对 IBM Netezza 数据库执行此显式传递。
我认为这根本不是 SAS 问题,而是 ODBC 驱动程序问题。
我能够将针对 ODBC 连接的问题复制到 mySQL 数据库,并且还使用来自 SAS 以外的程序的相同 ODBC 连接复制问题。
在 proc SQL 中似乎没有记录的选项可以执行此操作。您可以尝试询问SAS技术支持,看他们有什么建议。
我自己的建议是对查询字符串应用正则表达式替换,以在通过直通提交之前删除任何评论。
粘贴到 Whosebug 时字符串如何突出显示无关紧要。这是数据库在收到该字符串时所做的事情。它是否将双连字符视为减去某些前缀有否定运算符的值的尝试?还是将其视为行尾注释?
至少对于 Teradata,数据库将 --
识别为注释的开始,但由于它只获得一行代码,因此它注释掉了所有其余代码。
70 select * from connection to td
71 (select 1+2 -- Comment in line
72 +3 as name
73 , 4+5 as value
74
75 )
76 ;
TERADATA_0: Prepared: on connection 0
select 1+2 -- Comment in line +3 as name , 4+5 as value
所以它运行没有错误,但它只是 returns 单个值 3,因为它是 1 和 2 的总和。
另请注意,在 SAS 中 --
没有特殊含义。只是两个 -
相邻。试试这个查询,您会看到 X 与 AGE 具有相同的值。
select name,age,--age as x
from sashelp.class
;
要么使用带有行尾注释的源代码在数据库中创建一个可以从 SAS 调用的存储过程,要么在将行尾注释包含在 PROC SQL 代码中之前将其删除。
好吧,我真的不想在 SO 上回答我自己的问题,但这是 SAS 技术支持 (support@sas.com) 的官方回答:
Hello Joshua, I did some additional checking on this. Unfortunately SAS does not preserve the line breaks as you have noticed. Additionally the SAS/ACCESS engine does not have a function such as PRESERVE_COMMENTS seen in the Oracle engine. There is no real way to force this to be passed with the line breaks. The block comments will be the next best option. I am sorry for the inconvenience. Please let me know if there are any questions or concerns.
Thank you,
Sean