SAS:SELECT ... INTO导致随机单引号添加到结束

时间:2016-07-06 18:20:52

标签: sql sas

当我为特定的WHERE执行SELECT...INTO语句时,它会导致在结尾处出现随机单引号。我正在使用proc sql通过SAS运行以下

proc sql noprint;
    SELECT DISTINCT PrimaryAgent, PrimaryAgentName
       INTO :AgentID separated by '|', :AgentName separated by '|'
    FROM test.OUTPUT_REPORTDATATAB
    WHERE Region = "Western" AND District = "Saskatchewan";
quit;

AgentID将所有值分隔为|像往常一样,但当我去做%put时,AgentName最后会有一个引号(例如test | test2 | test3')。

这个问题只发生在Region和District的组合中,任何其他组合都可以。

我注意到这个Region和District组合位于数据集的底部,但我想如果那是问题的根源,它会导致AgentID和AgentName出现同样的问题。

关于可能导致此问题的任何想法?或者我可以删除这个单引号?

我已尝试substrtranslate但我尝试传递&AgentName。它打破了这个功能(说我错过了一个括号)。

我甚至尝试在前面添加转义非转义单引号,因此它至少有匹配的引号,但似乎无法正常工作无论是。

3 个答案:

答案 0 :(得分:1)

首先确保您没有尝试将太多字符放入宏变量中。宏变量只能是65K个字符。

SAS不会插入任何不在您数据中的字符。因此,如果您将@media screen and (min-width:600px) { #logo { float: left; } .menu { width: 100%; height: 70px; position: absolute; display: block; } .menu-icon { display: none; } header { height: 70px; background-color: #FFF; margin: auto; width: 100%; } nav { height: -66px; width: 100%; } nav ul { background-color: #FFF; display: inline; float: right; padding: 0.55em 2em 0 0; height: inherit; } nav ul li { display: inline; margin: 0.2em auto; } nav ul li:hover { background-color: #FFF; } nav ul li a { padding: 0 2em; } 视为宏变量值的一部分,那么大部分都是您用来填充它的数据集变量值的一部分。

检查变量AgentID和AgentName是否有引号。

如果您还没有找到,请检查其他非打印字符,这些字符可能会被宏处理器混淆为引号,或者在打印到LOG时看起来像是引号。

答案 1 :(得分:0)

嗯,非常奇怪。你的代码看起来很好。我创建了一个类似的(假设在这里)数据集,在其上运行您的代码,我没有得到任何单引号。

%put &agentName.;

对我来说,回报 - 正是我所期待的。

Name 1|Name 3|Name 6

您可以发布您的进入数据集 - 或至少一些相关记录吗?或者,这是我写的代码 - 看看是否有什么不同于你所得到的。但是这里有用的块从你的帖子中被扯掉了100%(添加了noprint用于测试)。

data output_reportdatatab;
primaryAgent=1; primaryAgentName="Name 1"; region="Western"; District="Saskatchewan"; output;
primaryAgent=2; primaryAgentName="Name 2"; region="Eastern"; District="Saskatchewan"; output;
primaryAgent=3; primaryAgentName="Name 3"; region="Western"; District="Saskatchewan"; output;
primaryAgent=3; primaryAgentName="Name 3"; region="Eastern"; District="Saskatchewan"; output;
primaryAgent=3; primaryAgentName="Name 3"; region="Western"; District="Saskatchewan"; output;
primaryAgent=3; primaryAgentName="Name 3"; region="Western"; District="Saskatchewan"; output;
primaryAgent=4; primaryAgentName="Name 4"; region="Western"; District="Alberta"; output;
primaryAgent=4; primaryAgentName="Name 4"; region="Western"; District="Manitoba"; output;
primaryAgent=5; primaryAgentName="Name 5"; region="Eastern"; District="British Columbia"; output;
primaryAgent=6; primaryAgentName="Name 6"; region="Western"; District="Saskatchewan"; output;
run;

proc sql noprint;
    SELECT DISTINCT PrimaryAgent, PrimaryAgentName
    INTO :AgentID separated by '|', :AgentName separated by '|'
        FROM OUTPUT_REPORTDATATAB
    WHERE Region = "Western" AND District = "Saskatchewan";
quit;

%put &agentName.;

答案 2 :(得分:0)

假设单引号实际上在数据中 - 我认为很有可能,特别是当你说它是数据集中的最后一行时;可能您的输入数据中有引号 - 您可以使用compress将其删除。

proc sql;
    SELECT DISTINCT compress(PrimaryAgent,"'") , compress(PrimaryAgentName,"'")
    INTO :AgentID separated by '|', :AgentName separated by '|'
        FROM test.OUTPUT_REPORTDATATAB
    WHERE Region = "Western" AND District = "Saskatchewan";
quit;

Bingo,没有单引号(假设这些字段通常不允许使用单引号)。如果他们有时被允许进入这些领域,那么这是一个棘手的问题,需要您提供更多信息才能回答。