顯示具有 SQL 標籤的文章。 顯示所有文章
顯示具有 SQL 標籤的文章。 顯示所有文章

2019年4月4日 星期四

[C#] 用CLR讓 SQL 可以用GZIP壓縮字串


C#  程式碼







     
        /// <summary>
        /// 将传入字符串以GZip算法压缩后,返回Base64编码字符
        /// </summary>
        /// <param name="rawString">需要压缩的字符串</param>
        /// <returns>压缩后的Base64编码的字符串</returns>
        public static string GZip(string rawString)
        {
            return rawString;   //off test
            if (string.IsNullOrEmpty(rawString) || rawString.Length == 0)
            {
                return "";
            }
            else
            {
                byte[] rawData = System.Text.Encoding.UTF8.GetBytes(rawString.ToString());
                byte[] zippedData = GZip_Compress(rawData);
                return (string)(Convert.ToBase64String(zippedData));
            }

        }
        /// <summary>
        /// GZip压缩
        /// </summary>
        /// <param name="rawData"></param>
        /// <returns></returns>
        public static byte[] GZip_Compress(byte[] rawData)
        {
            MemoryStream ms = new MemoryStream();
            GZipStream compressedzipStream = new GZipStream(ms, CompressionMode.Compress, true);
            compressedzipStream.Write(rawData, 0, rawData.Length);
            compressedzipStream.Close();
            return ms.ToArray();
        }
        /// <summary>
        /// 将传入的二进制字符串资料以GZip算法解压缩
        /// </summary>
        /// <param name="zippedString">经GZip压缩后的二进制字符串</param>
        /// <returns>原始未压缩字符串</returns>
        public static string UnGZip(string zippedString)
        {
            return zippedString;   //off test
            if (string.IsNullOrEmpty(zippedString) || zippedString.Length == 0)
            {
                return "";
            }
            else
            {
                byte[] zippedData = Convert.FromBase64String(zippedString.ToString());
                return (string)(System.Text.Encoding.UTF8.GetString(UnGZip_Decompress(zippedData)));
            }
        }
        /// <summary>
        /// ZIP解压
        /// </summary>
        /// <param name="zippedData"></param>
        /// <returns></returns>
        public static byte[] UnGZip_Decompress(byte[] zippedData)
        {
            MemoryStream ms = new MemoryStream(zippedData);
            GZipStream compressedzipStream = new GZipStream(ms, CompressionMode.Decompress);
            MemoryStream outBuffer = new MemoryStream();
            byte[] block = new byte[1024];
            while (true)
            {
                int bytesRead = compressedzipStream.Read(block, 0, block.Length);
                if (bytesRead <= 0)
                    break;
                else
                    outBuffer.Write(block, 0, bytesRead);
            }
            compressedzipStream.Close();
            return outBuffer.ToArray();
        }
 







產生SQL共用函式

-----------------------1.set SQL Server可執行CLR-----------------------
sp_configure 'clr enabled', 1
GO
RECONFIGURE
go

-----------------------2.建立ASSEMBLY-----------------------

CREATE ASSEMBLY Net_SQLCom  FROM '******\bin\Debug\SQLCom.dll'
WITH PERMISSION_SET = SAFE;
--drop ASSEMBLY Net_SQLCom
go

--chk  有沒有看到Net_SQLCom
SELECT * FROM sys.assemblies
go

-----------------------3.建立function-----------------------
--drop function GZip
--drop function UnGZip

CREATE FUNCTION [dbo].[GZip](@str [nvarchar](max) )
RETURNS [nvarchar](MAX) WITH EXECUTE AS CALLER
AS
EXTERNAL NAME [Net_SQLCom].[UserDefinedFunctions].[GZip]
GO


CREATE FUNCTION [dbo].[UnGZip](@str [nvarchar](max) )
RETURNS [nvarchar](MAX) WITH EXECUTE AS CALLER
AS
EXTERNAL NAME [Net_SQLCom].[UserDefinedFunctions].[UnGZip]
GO

--chk  有沒有看到function
SELECT * FROM sys.assembly_modules;

-----------------------4.Test-----------------------
select [dbo].[UnGZip]([dbo].[GZip]('setse' ))





注意資料庫型別

char資料有固定長度,並且都為英文數字。
nchar資料有固定長度,但不確定是否皆為英文數字。
varchar資料沒有固定長度,並且都為英文數字。
nvarchar資料沒有固定長度,且不確定是否皆為英文數字。

2018年10月12日 星期五

[SQL] 測試SQL timeout 語法



-- wait for 1 minute
WAITFOR DELAY '00:01'

-- wait for 1 second 
WAITFOR DELAY '00:00:01'

2016年7月20日 星期三

[MSSQL] 資料庫主體在資料庫中擁有 結構描述 且無法卸除 (Microsoft SQL Server, 錯誤: 15138)



參考:http://dog0416.blogspot.tw/2015/04/databasemssql-microsoft-sql-server-15138.html


在Microsoft SQL Server Managment Studio ,展開安全性 -> 使用者,滑鼠右鍵點選使
用者,選擇刪除。

出現刪除視窗後,點選確定,出現下列錯誤訊息。

錯誤訊息:
資料庫主體在資料庫中擁有 結構描述 且無法卸除 (Microsoft SQL Server, 錯誤: 15138)

Error message:
The database principal owns a schema in the database, and cannot be dropped. (Microsoft SQL Server, Error: 15138).

我們使用下列指令,將所有在此資料庫的結構描述指派給dbo,該資料庫使用者物件即可移除。

ALTER AUTHORIZATION ON SCHEMA::[無法刪除的使用者名稱] TO [dbo]

2014年8月13日 星期三

[SQL] 小心使用With NoLock



FROM: http://www.dotblogs.com.tw/ricochen/archive/2011/04/15/22758.aspx


擷自某段文字

當你使用NoLock時,你等於是告訴SQL Server 使用者不在意資料正確性和一致性,
假設某位使用者正在更新資料表,就會影響其他使用者查詢(with nolock)該資料的正確性和一致性,
那些查詢的使用者可能會遇到重複讀取相同資料、遺漏讀取或中途讀取..等狀況,
而我更在意頁面分割的動作
(頁面分割這裡不多敘述,但你可以參考2011年4月 RUN!PC我所發表的索引概念和設計)
我只和你說頁面分割是相當耗費系統資源的動作,
你絕對不希望使用者再查詢資料時,還得同時處理頁面分割動作,
所以無論如何請一定要減少頁面分割發生的頻率。





2014年7月7日 星期一

[SQL] NOT IN clause and NULL values


from:http://stackoverflow.com/questions/129077/not-in-clause-and-null-values


當下NOT IN時,括號裡面的值含有NULL,就會甚麼都撈不到

因為null不等於任何值

null也不等於null

所以,下NOT IN時,建議將null過濾掉 WHERE *** IS NOT NULL


A: select 'true' where 3 in (1, 2, 3, null)
B: select 'true' where 3 not in (1, 2, null)


Query A is the same as:
select 'true' where 3 = 1 or 3 = 2 or 3 = 3 or 3 = null
Since 3 = 3 is true, you get a result.
Query B is the same as:
select 'true' where 3 <> 1 and 3 <> 2 and 3 <> null
When ansi_nulls is on, 3 <> null is UNKNOWN, so the predicate evaluates to UNKNOWN, and you don't get any rows.
When ansi_nulls is off, 3 <> null is true, so the predicate evaluates to true, and you get a row.
zh-CN → zh-TW
,下

2014年4月24日 星期四

[C#] 預防SQL隱碼攻擊函式


form: http://www.dotblogs.com.tw/shinyo.her/archive/2010/08/20/17326.aspx



預防SQL隱碼攻擊函式


// CheckSQL() 檢查字串中有 SQL 隱碼攻擊的字串 「'」「;」「--」「|」「\t」「\n」
public bool CheckSQL(string sSQL)
{
bool bSafe = false;

if (sSQL == null)
bSafe = true;
else
{
bSafe = (  (sSQL.IndexOf("'")  >= 1 )
|| (sSQL.IndexOf(" ")  >= 1 )
|| (sSQL.IndexOf(";")  >= 1 )
|| (sSQL.IndexOf("--") >= 1 )
|| (sSQL.IndexOf("|")  >= 1 )
|| (sSQL.IndexOf("\t") >= 1 )
|| (sSQL.IndexOf("\n") >= 1 )
|| (sSQL.ToUpper().IndexOf("SELECT") >= 1 )
|| (sSQL.ToUpper().IndexOf("UPDATE") >= 1 )
|| (sSQL.ToUpper().IndexOf("DELETE") >= 1 )
|| (sSQL.ToUpper().IndexOf("CREATE") >= 1 )
);
}

return bSafe;
}



2014年3月31日 星期一

[T-SQL] WITH (NOLOCK): 提升查詢效率和避免LOCK發生



加了WITH (NOLOCK)即告訴SQL Server,我們的這段SELECT指令
無需去考慮目前table的transaction lock狀態,因此效能上會有明顯的提升,
而且資料庫系統的Lock現象會有明顯的減少(包含Dead Lock)。

有一點要特別注意,因為WITH (NOLOCK)不考慮目前table的transaction lock,
因此當有某些資料正處於多個phase交易(例如跨多個table的transaction交易-->如提款系統),
WITH (NOLOCK)會讓目前處理交易process的資料被乎略…

講白話一點,也就是說當使用NoLock時,它允許閱讀那些已經修改但是還沒有交易完成的資料。
因此如果有需要考量transaction交易資料的即時完整性時,使用WITH (NOLOCK)就要好好考慮一下。

如果不需考量transaction,WITH (NOLOCK)或許是個好用的參考




2012年11月28日 星期三

MS SQL 的資料型態


form http://codingboy.pixnet.net/blog/post.........


整數
 資料型別 說明
 INT 長度為 4 個 bytes;介於 -2,147,483,648 與 2,147,483,647 間的整數
 SMALLINT 長度為 2 個 bytes;介於 -32,768 與 32,767 間的整數
 TINYINT 長度為 1 個 bytes;介於 0 與 255 間的整數
 BIGINT 長度為 8 個 bytes;介於 -2^63 與 2^63-1 間的整數
 BIT 只佔用一個位元,且不允許存放 NULL 值
精確位數
 資料型別 說明
 DECIMAL[(p[,s])] 使用 2 到 17 個 bytes 來儲存資料,可儲存的值介於 -1038-1 與 1038-1 之間;p 用來定義小數點兩邊可以被儲存的位數總數目,而 s 代表小數點右邊的有效位數(s < p);p的預設值為 18 而 s 的預設值為0
 NUMERIC[(p[,s])] 與 DECIMAL[(p[,s])] 同
近似浮點數值
 資料型別 說明
 FLOAT[(n)] n 是儲存 float 數字的小數位數,介於 1 與 53 間;若 n 介於 1 與 24 間,儲存大小為 4 個 bytes,有效位數為 7 位數;若 n 介於 25 與 53 間,儲存大小為 8 個 bytes,有效位數為 15 位數
 REAL 長度為 4 個 bytes;介於 -3.4E-38 與 3.4E+38 間的浮點數;與 FLOAT(24) 相同
日期時間
 資料型別 說明
 DATETIME 長度為 8 個 bytes;介於 1/1/1753 與 12/31/9999 間的日期時間
 SMALLDATETIME 長度為 4 個 bytes;介於 1/1/1900 與 6/6/2079間的日期時間
字串
 資料型別 說明
 CHAR[(n)] 固定長度為 n 的字元型態,n 必須介於 1 與 8000 之間
 VARCHAR[(n)] 與 CHAR 相同,只是若輸入的資料小於 n,資料庫不會自動補空格,因此為變動長度之字串
 TEXT 用來儲存大量的(可高達兩億個位元組)字元資料,儲存空間以 8k 為單位動態增加
Unicode 字串
 資料型別 說明
 NCHAR 與 CHAR 相同,只是每一個字元為兩個 bytes 的 unicode,且 n 最大為 4000
 NVARCHAR 與 VARCHAR 相同,只是每一個字元為兩個 bytes 的 unicode,且 n 最大為 4000
 NTEXT 和 TEXT 雷同,只是儲存的是 Unicode 資料
二元碼字串
 資料型別 說明
 BINARY[(n)] 固定長度為 n+4 個 bytes; n 為 1 到 8000 的值,輸入的值必需符合兩個條件:(1) 每一個值皆為 0-9、a-f 的值;(2)每一個值的前面必須有 0X
 VARBINARY[(n)] 與 BINARY 相同,只是若輸入的資料小於 n,資料庫不會自動補 0,因此長度為變動的
 IMAGE 和 TEXT 雷同,只是儲存的是影像資料
貨幣
 資料型別 說明
 MONEY 長度為 8 個 bytes 的整數,小數點的精確度取四位
 SMALLMONEY 長度為 4 個 bytes 的整數,小數點的精確度取四位
標記
 資料型別 說明
 TIMESTAMP 8 bytes 的 16 進位值
 UNIQUEIDENTIFIER 16 bytes 的 16 進位值
其他
 資料型別 說明
 SQL_VARIANT 此資料型別可儲存 text、ntext、timestamp 與 sql_variant 以外的各種 SQL Server 支援的資料型別。
 CURSOR 查詢結果的資料集 (註:2005)
 TABLE 表格型式的資料 (註:2005)

2012年11月21日 星期三

SQL 指令WITH * AS //// (CTE)

form http://www.cnblogs.com/CareySon/archive/2011/12/12/2284740.html

利用快取 儲存一個 "常用" 的查詢結果




WITH
cr AS
(
    select * from user WHERE Name like 'C%'
)
SELECT Name from cr WHERE Name like '%A%'

SQL 測量SQL語法效能

計算SQL語法的效能



01.--訂一個開始跟結束
02.DECLARE @START DATETIME,
03.@STOP  DATETIME
04.--取得開始時間(取系統時間)
05.SET @START = GETDATE()
06.WAITFOR DELAY '00:00:00.080' --利用延遲語法來做延遲ms,在此放置SQL Script
07. 
08.--語法Start
09. 
10.SELECT  *  FROM  Employees
11. 
12.--語法End
13. 
14.--執行完了再取得執行完成時的時間(系統時間)
15.SET @STOP = GETDATE()
16.--算出二者差異的時間就是執行的時間了
17.SELECT 'The Execution took ' + CONVERT(varchar(20), DATEDIFF(ms, @START, @STOP)) + ' ms'





form http://subocheng.blogspot.com/2007/05/sql-script.html


 

MangoHost Copyright © 2009 Cookiez is Designed by Ipietoon for Free Blogger Template