informix 11.5(含)版本以前沒有提供charindex功能.
因為想要依傳入的尋找 字元組合來取得符合的position,所以為了方便,自已寫了一個湊合著用
以下function是區分大小寫尋找的..
--DOP FUNCTION uf_charindex;
/*
in_str:被搜尋的字元
in_delimiter;尋找字元
in_occurence:被找到的次數
in_exact:是否依in_delimiter逐字尋找
*/
CREATE FUNCTION uf_charindex
(in_str VARCHAR(255),in_delimiter VARCHAR(255)
,in_occurence INTEGER, in_exact CHAR(1) )
RETURNING INTEGER ;
DEFINE q_pos INTEGER;
DEFINE i INTEGER;
DEFINE q_len INTEGER;
DEFINE q_time INTEGER;
DEFINE j INTEGER;
DEFINE q_len_del INTEGER;
DEFINE q_found CHAR(1);
DEFINE q_str VARCHAR(255);
DEFINE q_step INTEGER;
IF nvl(in_occurence,1) <=1 THEN
LET in_occurence = 1;
END IF;
LET q_time=0;
LET i = 1;
LET q_pos = 0;
LET j = 1;
LET q_found = '0';
LET q_step = 1;
LET q_len = char_length(in_str);
LET q_len_del = char_length(in_delimiter);
--是否依in_delimiter逐字尋找符合字
IF in_exact = '1' THEN --完全符合
LET q_step = q_len_del;--先記下完整字長度
LET q_len_del = 1; --最外層只跑一次即可
END IF ;
FOR j = 1 TO q_len_del STEP 1
LET i = 1;
LET q_time = 0;
LET q_pos = 0;
LET q_found = '0';
--取比較字(若in_exact='1'則全部符合)
IF in_exact = '1' THEN
LET q_str = in_delimiter;
ELSE --否則逐字找直到找到in_occurence為止
LET q_str = substr(in_delimiter,j,1);
END IF;
FOR i = 1 TO q_len STEP 1
IF substr(in_str,i,q_step) = q_str THEN
LET q_pos = i;
LET q_time = q_time +1;
--找到後若與指定出現次數相符則結束
IF q_time = in_occurence THEN
LET q_found = '1';
EXIT FOR;
END IF;
END IF;
END FOR;
IF q_found = '1' THEN
EXIT FOR;
END iF;
END FOR;
RETURN q_pos;
END FUNCTION;
測試一下
SELECT FIRST 1 uf_charindex("臺東縣臺東市","縣市",1,'0') FROM systables;
傳回3
SELECT FIRST 1 uf_charindex("臺北市信義區","縣市",1,'0') FROM systables;
傳回3
SELECT FIRST 1 uf_charindex("臺東縣臺東市","市縣",1,'0') FROM systables;
傳回6
SELECT FIRST 1 uf_charindex("This is a book","book",1,'1') FROM systables;
傳回11
SELECT FIRST 1 uf_charindex("This are a lot of bOOks","O",2,'1') FROM systables;
傳回21
2012年11月10日 星期六
SSRS 2008 R2 網站很慢
下載了Report Builder 3.0進行測試
安裝過程中,需要設定report server
結果在進入 http://servername/reportserver 網頁的過程中,好慢好慢.
試了半天,以為是自已的SSRS 2008 R2安裝有問題.
結果竟是因為防毒軟體NOD32 Web存取防護中,HTTP、HTTPS掃描設定中啟用了HTTP檢查.
雖然試著位址管理想要排除本機HTTP的掃描. 但似乎都無效??
只好先關閉啟用了HTTP檢查的功能.
關閉後,Report Server變得飛快..當然Report Builder Preview也變快了
另外, 在http://localhost/reports/ 下, 按下報表產生器後, 出現了以下訊息
安裝過程中,需要設定report server
結果在進入 http://servername/reportserver 網頁的過程中,好慢好慢.
試了半天,以為是自已的SSRS 2008 R2安裝有問題.
結果竟是因為防毒軟體NOD32 Web存取防護中,HTTP、HTTPS掃描設定中啟用了HTTP檢查.
雖然試著位址管理想要排除本機HTTP的掃描. 但似乎都無效??
只好先關閉啟用了HTTP檢查的功能.
關閉後,Report Server變得飛快..當然Report Builder Preview也變快了
另外, 在http://localhost/reports/ 下, 按下報表產生器後, 出現了以下訊息
若使用報表產生器,您必須在此電腦上安裝.Net Framework 3.5
但本機的.net framework明明就是上到了4.0
結果在切換成相容性檢視後,就正常了.
雖然我之前sql server 2008 r2安裝的是英文版,
但report manger web site的介面是跟著IE的語言設定而定的,所以介面就出現了中文
如果想要變回英文,則在IE網際網路選項中, 一般頁籤最下方的語言鍵,新增英文[en]語言,並調整序順到第一位
即可切換為英文介面.
另外,由 http://localhost/reports/ 下安裝報表產生器會自動安裝中文版report builder 3.0
若要使用英文版介面,則需再下載安裝英文版report builder後,再自行開啟即可.
2012年10月31日 星期三
informix dateadd
informix 11.5模擬sql server dateadd, 但傳入及傳出皆為國曆日期數字
CREATE FUNCTION ifx_f_dateadd
(in_type varchar(5),in_date integer, in_diff integer )
RETURNING integer ;
DEFINE p_date date;
DEFINE p_day integer;
--轉為西元日期
--改成以下方式來轉換
--因為上述方式會隨著DB版本或onconfig中日期格式指定而變,可能會有錯誤.
SELECT (TO_DATE((in_date+19110000)::char(8),'%Y%m%d'))
INTO p_date FROM empty;
IF UPPER(in_type) IN ('DAY','D') THEN
SELECT p_date + in_diff into p_date from empty;
ELSE IF UPPER(in_type) in ('MONTH','M') THEN
--改成以下方式,因為1011031 取下月時會有The result of a datetime computation is out of range.的錯誤,
--以下方法閏年也適用
SELECT add_months(p_date,in_diff ) into p_date from empty;
ELSE IF UPPER(in_type) IN ('YEAR','Y' ) THEN
--以下方法閏年也適用
SELECT add_months(p_date,in_diff*12) into p_date from empty;
END IF; END IF; END IF; --這一串END IF; 搞了我一個小時才知道要這樣寫....
SELECT TO_CHAR(p_date ,'%Y%m%d')::INTEGER - 19110000
INTO p_day
FROM empty;
END FUNCTION;
測試,
CREATE TABLE empty (col1 INT);
INSERT into empty VALUES(0);
INSERT into empty VALUES(0);
select ifx_f_dateadd('y',1010814,-1) FROM empty;
回傳1000814
select sr_f_dateadd('m',1011031,1) FROM empty
回傳1011130
select sr_f_dateadd('y',1010229,-1) FROM empty
回傳1000228
ps.2012/08/14寫第一版,3個月後,知識長進,大改一番.
sql cluster firewall應開哪些port?
人客的資安開始規定,所有主機都要開啟Windows 防火牆,所有輸入都要以例外的方式來設定.
雖然網管已有一層防火牆,但敵人就在你身邊,自已人也不可靠啊...
主機間有二台主機做sql server cluster (db server name = sql-cluster) , 在開啟了防火牆後, 另一台主機無法以sql-cluster進行連線.
但使用IP連線卻是可以的
試了半天,除了在二台sql cluster db主機要開1434,1433的port之外
還得要加開137,138,139,445 四個port 才能使用server name 來連線
這些port在例外中已有定義,為檔案及印表機共用,只要勾選即可
另外,應在變更領域中加入IP自訂清單比較保險.
雖然網管已有一層防火牆,但敵人就在你身邊,自已人也不可靠啊...
主機間有二台主機做sql server cluster (db server name = sql-cluster) , 在開啟了防火牆後, 另一台主機無法以sql-cluster進行連線.
但使用IP連線卻是可以的
試了半天,除了在二台sql cluster db主機要開1434,1433的port之外
還得要加開137,138,139,445 四個port 才能使用server name 來連線
這些port在例外中已有定義,為檔案及印表機共用,只要勾選即可
另外,應在變更領域中加入IP自訂清單比較保險.
2012年10月30日 星期二
IIS Worker Process問題
在一台windows 2003 R2標準版環境,建立了一個.net 4.0的網站.
結果每隔一段期間, 就會出以下的錯誤,
szAppName : w3wp.exe szAppVer : 6.0.3790.3959 szModName : unknown
szModVer : 0.0.0.0 offset : 62cbb9ce
C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\1\WERdaef.dir00\w3wp.exe.mdmp
C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\1\WERdaef.dir00\appcompat.txt
1.重啟W3SVC (Net Stop W3SVC and Net Start W3SVC)
2.清除C:Documents and Settings\Administrator\Local Settings\Temp
3.重啟iis (iisreset)
iisreset後,一切又都正常
後來建立一個新的應用程式集區,將網站原來使用的DefaultAppPool改成新的集區後,目前看來正常了...
我想應該是預設應用程式集區原本是.net 2.0網站使用, 而我的網站是.net 4.0, 二個錯亂了吧??
結果每隔一段期間, 就會出以下的錯誤,
szAppName : w3wp.exe szAppVer : 6.0.3790.3959 szModName : unknown
szModVer : 0.0.0.0 offset : 62cbb9ce
C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\1\WERdaef.dir00\w3wp.exe.mdmp
C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\1\WERdaef.dir00\appcompat.txt
1.重啟W3SVC (Net Stop W3SVC and Net Start W3SVC)
2.清除C:Documents and Settings\Administrator\Local Settings\Temp
3.重啟iis (iisreset)
iisreset後,一切又都正常
後來建立一個新的應用程式集區,將網站原來使用的DefaultAppPool改成新的集區後,目前看來正常了...
我想應該是預設應用程式集區原本是.net 2.0網站使用, 而我的網站是.net 4.0, 二個錯亂了吧??
2012年10月23日 星期二
Informix catalogs 讀取資料表及欄位資訊
--資料表
SELECT * FROM systables WHERE tabid > 99
;
--資料表及欄位
SELECT * FROM systables a INNER JOIN syscolumns b
ON a.tabid = b.tabid
WHERE a.tabid > 99
;
--資料表欄位及類型 (參考此dbform此篇討論 )
SELECT t.tabname,c.colno, c.colname[1,20] column,
CASE coltype
WHEN 0 THEN 'char(' || TRIM(CAST (c.collength AS CHAR(5))) || ')'
WHEN 1 THEN 'smallint'
WHEN 2 THEN 'integer'
WHEN 3 THEN 'float'
WHEN 4 THEN 'smallfloat'
WHEN 5 THEN 'decimal(' ||
TRIM(CAST(TRUNC(c.collength/256) AS VARCHAR(8)) || ',' ||
CAST(c.collength - TRUNC(c.collength/256)*256 AS VARCHAR(8))) || ')'
WHEN 6 THEN 'serial'
WHEN 7 THEN 'date'
WHEN 8 THEN 'money(' ||
TRIM(CAST(TRUNC(c.collength/256) AS VARCHAR(8)) || ',' ||
CAST(c.collength - TRUNC(c.collength/256)*256 AS VARCHAR(8))) || ')'
WHEN 9 THEN 'null'
WHEN 10 THEN 'datetime'
WHEN 11 THEN 'byte'
WHEN 12 THEN 'text'
WHEN 13 THEN 'varchar(' || TRIM(CAST(c.collength AS CHAR(5))) || ')'
WHEN 14 THEN 'interval'
WHEN 15 THEN 'nchar(' || TRIM(CAST(c.collength AS CHAR(5))) || ')'
WHEN 16 THEN 'nvarchar(' || TRIM(CAST(c.collength AS CHAR(5))) || ')'
WHEN 17 THEN 'int8'
WHEN 18 THEN 'serial8'
WHEN 19 THEN 'set'
WHEN 20 THEN 'multiset'
WHEN 21 THEN 'list'
WHEN 22 THEN 'row'
WHEN 23 THEN 'collection'
WHEN 24 THEN 'rowdef'
WHEN 40 THEN 'lvarchar'
WHEN 256 THEN 'char(' || TRIM(CAST(c.collength AS CHAR(5))) ||
') not null'
WHEN 257 THEN 'smallint not null'
WHEN 258 THEN 'integer not null'
WHEN 259 THEN 'float not null'
WHEN 260 THEN 'smallfloat not null'
WHEN 261 THEN 'decimal('||
TRIM(CAST(TRUNC(c.collength/256) AS VARCHAR(8)) || ',' ||
CAST(c.collength - TRUNC(c.collength/256)*256 AS VARCHAR(8))) ||
') not null'
WHEN 262 THEN 'serial not null'
WHEN 263 THEN 'date not null'
WHEN 264 THEN 'money(' ||
TRIM(CAST(TRUNC(c.collength/256) AS VARCHAR(8)) || ',' ||
CAST(c.collength - TRUNC(c.collength/256)*256 AS VARCHAR(8))) ||
') not null'
WHEN 265 THEN 'null not null'
WHEN 266 THEN 'datetime not null'
WHEN 267 THEN 'byte not null'
WHEN 268 THEN 'text not null'
WHEN 269 THEN 'varchar(' || TRIM(CAST(c.collength AS CHAR(5))) ||
') not null'
WHEN 270 THEN 'interval not null'
WHEN 271 THEN 'nchar(' || TRIM(CAST(c.collength AS CHAR(5))) ||
') not null'
WHEN 272 THEN 'nvarchar(' || TRIM(CAST(c.collength AS CHAR(5))) ||
') not null'
WHEN 273 THEN 'int8 not null'
WHEN 274 THEN 'serial8 not null'
WHEN 275 THEN 'set not null'
WHEN 276 THEN 'multiset not null'
WHEN 277 THEN 'list not null'
WHEN 278 THEN 'row not null'
WHEN 279 THEN 'collection not null'
WHEN 280 THEN 'rowdef not null'
ELSE CAST(coltype AS CHAR(10))
END datatype
FROM systables t INNER JOIN syscolumns c
ON t.tabid = c.tabid
WHERE t.tabid > 99
ORDER BY 1,2
;
2012年10月5日 星期五
Excel openrowset 奇怪的問題(再續)
一段寫在stored procedure 的excel openrowset 今天又出問題了.
無法初始化連結伺服器'(null)'的OLE DB提供者 'Microsoft.Jet.OLEDB.4.0'的資料來源物件
這個問題困擾了好久, 有時重啟sql server 就好, 有時得要重開機.
很困擾.
查到這篇文章
OPENROWSET (T-SQL) – Sometimes You Have to Stop and Smell the Roses
講到權限問題, SQL Server service accounts必需要有TEMP directory的讀寫權限.
查看了一下, SQL SERVER是使用本機帳(local system) 號啟動的.
於是乎,再參考一下這篇文章Location of user account temp dir for service accounts
找到使用者對應
相關的討論在napierm 的回文中,也有說明.
希望這是最後一次搞這個問題了.
無法初始化連結伺服器'(null)'的OLE DB提供者 'Microsoft.Jet.OLEDB.4.0'的資料來源物件
這個問題困擾了好久, 有時重啟sql server 就好, 有時得要重開機.
很困擾.
查到這篇文章
OPENROWSET (T-SQL) – Sometimes You Have to Stop and Smell the Roses
講到權限問題, SQL Server service accounts必需要有TEMP directory的讀寫權限.
查看了一下, SQL SERVER是使用本機帳(local system) 號啟動的.
於是乎,再參考一下這篇文章Location of user account temp dir for service accounts
找到使用者對應
- Local Service (NT AUTHORITY\LOCAL SERVICE)
- Network Service (NT AUTHORITY\NETWORK SERVICE)
- Local System (NT AUTHORITY\SYSTEM)
相關的討論在napierm 的回文中,也有說明.
So, the fix is to do one of the following:
- Change the SQL Server's service Log On to "Local System account" OR
- Provide full access to the "\Documents and
Settings\NetworkService\Local Settings\Temp" for any account that needs
to run the queries.
訂閱:
文章 (Atom)
VS CODE離線安裝套件方式-續
去年 vscode離線安裝 powershell nupkg 今年在一台無外網的 windwos 2025上安裝時遇到了powershell版本一直讀取到了5.1的版本,鬼打牆了一下午,在VM還原重測測了好幾回,應該是可行了。 將下載到的免安裝powershell 解壓縮到...
-
一個老舊的aspx web form專案,調了一些功能建置成功,但進行部署時顯示以下錯誤。 在應用程式層級之外使用註冊為 allowDefinition='MachineToApplication' 的區段發生錯誤。錯誤的原因可能是虛擬目錄尚未在 IIS 中設定為...
-
freeFTPd是套免費的SFTP SERVER支援22 port SFTP及21port FTP,一般找到免費的都不支援SFTP只有技援FTPS。 之前一直有個困擾在幾台主機安裝後,有幾台重開機後,SFTP SERVER必須手動去啟動,一直以來老是搞不懂為什麼,今天看到一篇文...
-
Row.Cells[2].Text == "abc" ? "ok" : "not ok" ; 或加入Microsoft. VisualBasic 參考使用 vb namespace using Microsoft...