在使用SAS 执行显式传递时,文本传递到服务器的方式与在编辑器或 .sas 文件本身中布局的方式不同。SAS 似乎在一行上传递所有文本。
当您使用 --comments传递查询时,这会带来问题。
例:
以下代码将在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技术支持,看看他们是否有任何建议。
我自己的建议是对查询字符串应用正则表达式替换,以便在通过传递提交之前删除任何注释。
好吧,我真的很讨厌回答我自己关于SO的问题,但这是SAS技术支持(support@sas.com)的官方答案:
你好约书亚,我对此做了一些额外的检查。不幸 正如您所注意到的那样,SAS 不会保留换行符。此外,SAS/ACCESS 引擎没有诸如 PRESERVE_COMMENTS在Oracle引擎中看到的。没有真正的方法 强制使用换行符传递此内容。块注释将 成为下一个最佳选择。 对于给您带来的不便,我深表歉意。 请 如果有任何问题或疑虑,请告诉我。
谢谢
肖恩
字符串在粘贴到 StackOverFlow 中时如何突出显示并不重要。这是数据库在收到该字符串时执行的操作。 它是否将双连字符视为试图减去一些带有否定运算符前缀的值? 还是将其视为行尾评论?
至少在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
所以它运行没有错误,但它只返回一个值 3,因为这是 1 和 2 的总和。
另请注意,在 SAS 中,--
没有特殊含义。它只是两个-
彼此相邻。 尝试此查询,您将看到 X 与 AGE 具有相同的值。
select name,age,--age as x
from sashelp.class
;
使用带有行尾注释的源代码在数据库中创建可从 SAS 调用的存储进程,或者在将行尾注释包含在 PROC SQL 代码中之前将其删除。