2016-07-06 136 views
0

当我为某个特定的WHERE执行SELECT...INTO语句时,会导致最后有一个随机单引号。我正在使用通过SAS的proc sql运行以下代码SAS:SELECT ... INTO导致随机单引号添加到结尾

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')。

这个问题只发生在区域和区域的组合上,其他任何组合都没问题。

我确实注意到这个区域和区域组合位于数据集的底部,但我想如果这是问题的根源,它将对AgentID和AgentName引发同样的问题。

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

我试过substrtranslate,但只要我尝试通过我的&AgentName。它打破了功能(说我错过了括号)。

我甚至尝试添加一个逃脱非转义单引号到前面,所以它至少有匹配的报价,但似乎并没有任何工作。

+0

有多少条记录符合您的查询? AgentID或AgentName字段的平均长度是多少? SAS宏变量只能有65K长。 – Tom

+0

20条记录匹配查询,AgentID长度为6个字符,AgentName不同,但没有多于50个字符 – sampson7185

+0

尝试更改查询顺序(所以'test3'不会结束)。报价是否仍然出现在那里? – Joe

回答

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; 

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

+0

这工作完美,谢谢修复! – sampson7185

0

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

%put &agentName.; 

对我来说,返回 - 我的期望值。

Name 1|Name 3|Name 6 

您可以发布您的ingoing数据集 - 或至少一些相关记录吗?或者,这里是我写的代码 - 查看是否有什么东西与你有什么不同。但是这里有用的块是从你的帖子中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.; 
1

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

SAS不会插入任何不在您的数据中的字符。因此,如果您看到test3'作为宏变量值的一部分,那么它最可能是您用来填充它的数据集变量值的一部分。

检查变量AgentID和AgentName的引号。

如果您没有找到任何内容,请检查打印到LOG时可能被宏处理器混淆的其他非打印字符作为引号或看起来像引号。

+0

我确实试过查看数据,数据中没有可见的单引号。代理名称永远不会超过50个字符。我将如何检查非打印字符? – sampson7185

+0

你可以找引用。 '如果indexc(代理名,“'”)然后把AgentName =;''我个人只是寻找任何不是正常的7位ASCII码。 'IF lengthN(compress(AgentName,collat​​e(32,127)))> 0 then Then AgentName =;' – Tom