2016-07-06 58 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