sqlchartoint
『壹』 sql高手進
1.創建庫
CREATE DATABASE [SiteFactory] ON PRIMARY
( NAME = N'SiteFactory', FILENAME = N'c:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\SiteFactory.mdf' , SIZE = 7168KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
LOG ON
( NAME = N'SiteFactory_log', FILENAME = N'c:\Program Files\Microsoft SQL Server\MSSQL.1\老鄭MSSQL\DATA\SiteFactory_log.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
COLLATE Chinese_PRC_CI_AS
GO
EXEC dbo.sp_dbcmptlevel @dbname=N'SiteFactory', @new_cmptlevel=90
GO
2. 查詢:Select * from 表名
更新:update 表名 set 欄位名=值 where 條件
刪除:跡賀 Delete from 表名 where 條件
插入:Insert into 表名(欄位1,字姿含派段2)values(值1,值2)
3.創建存儲過程
CREATE PROCEDURE <Procere_Name, sysname, ProcereName>
-- Add the parameters for the stored procere here
<@Param1, sysname, @p1> <Datatype_For_Param1, , int> = <Default_Value_For_Param1, , 0>,
<@Param2, sysname, @p2> <Datatype_For_Param2, , int> = <Default_Value_For_Param2, , 0>
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procere here
SELECT <@Param1, sysname, @p1>, <@Param2, sysname, @p2>
END
GO
調用存儲過程 exec 存儲過程名稱 參數1,參數2
5.游標使用
Declare tb Cursor LOCAL
FOR
select DeptID from Department where ParentID=@DeptID order by DeptID
set @level =@level+1
Open TB
Fetch tb into @DeptID
While @@FETCH_STATUS=0
BEGIN
set @sort = @sort+1
INSERT @t_Level VALUES(@DeptID,@level,@sort)
IF @@NESTLEVEL<32
BEGIN
INSERT @t_Level SELECT * FROM func_AdminDeptList(@DeptID,@level,@sort)
SET @sort=@sort+@@ROWCOUNT
END
FETCH tb INTO @DeptID
END
RETURN
6. 創建函數
CREATE FUNCTION <Table_Function_Name, sysname, FunctionName>
(
-- Add the parameters for the function here
<@param1, sysname, @p1> <data_type_for_param1, , int>,
<@param2, sysname, @p2> <data_type_for_param2, , char>
)
RETURNS
<@Table_Variable_Name, sysname, @Table_Var> TABLE
(
-- Add the column definitions for the TABLE variable here
<Column_1, sysname, c1> <Data_Type_For_Column1, , int>,
<Column_2, sysname, c2> <Data_Type_For_Column2, , int>
)
AS
BEGIN
-- Fill the table variable with the rows for your result set
RETURN
END
GO
『貳』 簡單sql存儲過程實例、儲過程實戰
實例1:只返回單一記錄集的存儲過程。
銀行存款表(bankMoney)的內容如下
Id
userID
Sex
Money
001
Zhangsan
男
30
002
Wangwu
男
50
003
Zhangsan
男
40
要求1:查詢表bankMoney的內容的存儲過程
create
procere
sp_query_bankMoney
as
select
*
from
bankMoney
go
exec
sp_query_bankMoney
注*
在使用過程中只需要把中的SQL語句替換為存儲過程名,就可以了很方便吧!
實例2(向存儲過程中傳遞參數):
加入一筆記錄到表bankMoney,並查詢此表中userID=
Zhangsan的所有存款的總金額。
Create
proc
insert_bank
@param1
char(10),@param2
varchar(20),@param3
varchar(20),@param4
int,@param5
int
output
with
encryption
---------加密
as
insert
bankMoney
(id,userID,sex,Money)
Values(@param1,@param2,@param3,
@param4)
select
@param5=sum(Money)
from
bankMoney
where
userID='Zhangsan'
go
在SQL
Server查詢分析器中執行該存儲過程的方法是:
declare
@total_price
int
exec
insert_bank
'004','Zhangsan','男',100,@total_price
output
print
'總余額為'+convert(varchar,@total_price)
go
在這里再啰嗦一下存儲過程的3種傳回值(方便正在看這個例子的朋友不用再去查看語法內容):
1.以Return傳回整數
2.以output格式傳回參數
3.Recordset
傳回值的區別:
output和return都可在批次程式中用變數接收,而recordset則傳回到執行批次的客戶端中。
實例3:使用帶有復雜
SELECT
語句的簡單過程
下面的存儲過程從四個表的聯接中返回所有作者(提供了姓名)、出版的書籍以及出版社。該存儲過程不使用任何參數。
USE
pubs
IF
EXISTS
(SELECT
name
FROM
sysobjects
WHERE
name
=
'au_info_all'
AND
type
=
'P')
DROP
PROCEDURE
au_info_all
GO
CREATE
PROCEDURE
au_info_all
AS
SELECT
au_lname,
au_fname,
title,
pub_name
FROM
authors
a
INNER
JOIN
titleauthor
ta
ON
a.au_id
=
ta.au_id
INNER
JOIN
titles
t
ON
t.title_id
=
ta.title_id
INNER
JOIN
publishers
p
ON
t.pub_id
=
p.pub_id
GO
au_info_all
存儲過程可以通過以下方法執行:
EXECUTE
au_info_all
實例4:使用帶有參數的簡單過程
CREATE
PROCEDURE
au_info
@lastname
varchar(40),
@firstname
varchar(20)
AS
SELECT
au_lname,
au_fname,
title,
pub_name
FROM
authors
a
INNER
JOIN
titleauthor
ta
ON
a.au_id
=
ta.au_id
INNER
JOIN
titles
t
ON
t.title_id
=
ta.title_id
INNER
JOIN
publishers
p
ON
t.pub_id
=
p.pub_id
WHERE
au_fname
=
@firstname
AND
au_lname
=
@lastname
GO
au_info
存儲過程可以通過以下方法執行:
EXECUTE
au_info
'Dull',
'Ann'
--
Or
EXECUTE
au_info
@lastname
=
'Dull',
@firstname
=
'Ann'
--
Or
EXECUTE
au_info
@firstname
=
'Ann',
@lastname
=
'Dull'
實例5:使用帶有通配符參數的簡單過程
CREATE
PROCEDURE
au_info2
@lastname
varchar(30)
=
'D%',
@firstname
varchar(18)
=
'%'
AS
SELECT
au_lname,
au_fname,
title,
pub_name
FROM
authors
a
INNER
JOIN
titleauthor
ta
ON
a.au_id
=
ta.au_id
INNER
JOIN
titles
t
ON
t.title_id
=
ta.title_id
INNER
JOIN
publishers
p
ON
t.pub_id
=
p.pub_id
WHERE
au_fname
LIKE
@firstname
AND
au_lname
LIKE
@lastname
GO
au_info2
存儲過程可以用多種組合執行。下面只列出了部分組合:
EXECUTE
au_info2
--
Or
EXECUTE
au_info2
'Wh%'
--
Or
EXECUTE
au_info2
@firstname
=
'A%'
--
Or
EXECUTE
au_info2
'[CK]ars[OE]n'
--
Or
EXECUTE
au_info2
'Hunter',
'Sheryl'
--
Or
EXECUTE
au_info2
'H%',
'S%'
『叄』 sql中int轉char的問題
declare @i int
declare @m varchar(2) --change to varchar(2)
set @i = 0
while @i < 96
begin
--set @m=convert(varchar,@i)
set @m=cast(@i as varchar)
print '消橋Face/'+@m+'.gif'叢橋數
set @i = @i + 1
end
--result
Face/滲首0.gif
Face/1.gif
Face/2.gif
Face/3.gif
Face/4.gif
Face/5.gif
Face/6.gif
Face/7.gif
Face/8.gif
Face/9.gif
Face/10.gif
Face/11.gif
Face/12.gif
Face/13.gif
Face/14.gif
...........
『肆』 一個sql語句問題
解釋:to_char用來把日期型,整液春輪數型等類型強制轉換成字元型,
比如TIMES 欄位為 2009-07-02格式是日期格式的。森並
用to_Char轉換結果為鬧信:
select to_char(times,'yyyymm') from al;
結果:
200907
『伍』 oracle中如何將varchar型轉換成int型
這樣:select to_number('123') from al
oracle沒有顯示的INT型,你直接定義成number就好,強制類型知缺察轉換函數都差不多,轉扮型換為日期型就是TO_DATE(),
轉換為數字就是TO_NUM(),轉換為字搭茄符就是TO_CHAR(),括弧中跟需要轉換的內容,日期型注意格式掩碼。
(5)sqlchartoint擴展閱讀:
注意事項
CAST()和CONVERT()函數可用來獲取一個類型的值,並產生另一個類型的值。
這個類型可以是以下值其中的一個:
BINARY[(N)]
CHAR[(N)]
DATE
DATETIME
DECIMAL
SIGNED[INTEGER]
TIME
UNSIGNED[INTEGER]
所以也可以用CAST解決問題:
selectserver_idfromcardserverwheregame_id=1orderbyCAST(server_idasSIGNED)desclimit10
也可以使用CONVERT來搞定此問題:
selectserver_idfromcardserverwheregame_id=1orderbyCONVERT(server_id,SIGNED)desclimit10
『陸』 sql 取字元串的值 並加一
不同的有不同方法的額,支持正則就很快,不支持就使用自定義函數實現。
正則方法(Oracle)
SELECT SUBSTR('WIN000018'
,1
,LENGTH('WIN000018') -
LENGTH(REGEXP_REPLACE('WIN000018', '[^0-9]+0+', ''))) ||
TO_CHAR(TO_NUMBER(REGEXP_REPLACE('WIN000018', '[^0-9]', '')) + 1)
FROM DUALCREATE
FUNCTION [dbo].[GET_NUMBER_ADD1](@P VARCHAR(100)) RETURNS VARCHAR(100)
AS
BEGIN
DECLARE @S NVARCHAR(100)
DECLARE @R NVARCHAR(100)
DECLARE @I INT
DECLARE @J INT
SET @I=LEN(@P)
SET @S = @P
WHILE PATINDEX('%[^0-9]%',@S) > 0
BEGIN
set @s=stuff(@s,patindex('%[^0-9]%',@s),1,'')
END
SET @J= convert(int,@s)+1
set @R=right('00000000'+convert(nvarchar,@j),len(@i))
set @R= left(@p,@i-len(@i))+@R
RETURN @R
END
--select GET_NUMBER_ADD1('WIN000018') from temp
『柒』 在sql語句中怎樣把char類型轉換成int類型
首先char類型的必須是數字,將字元的數字轉成數字,比如'0'轉成0可以直接用加法來實現;
例如:將pony表中的d 進行排序,可d的定義為varchar,可以這樣解決;
select * from pony order by (d+0);
在進行ifnull處理時,比如 ifnull(a/b,'0') 這樣就會導致 a/b成了字元串,因此需要把'0'改成0,即可解決此困擾;
比較數字和varchar時,比如a=11,b="11ddddd"。
(7)sqlchartoint擴展閱讀
char類型佔1位元組,就是8位,所能存儲的正整數是 0111 1111,即127。現在將 int 型的整數i= 128 賦予ch,會產生溢出。
因128是 int 型,占 4 位元組,二進制代碼為 0000 0000 0000 0000 0000 0000 1000 0000.。若將它賦給一個只有8位的char 類型變數,只能將低8位的1000 0000 放進去,其他的都會被刪掉。
整數在計算機中都是以補碼的形式存儲的,此時1000 0000 在計算機的眼裡,是一個補碼,最左邊是 1 表示負數,補碼1000 0000 所對應的十進制是 -128,所以最後輸出的就是 -128。因此溢出會使得最大正整數變成最小負整數。
『捌』 [Err] 42000 - [SQL Server]從數據類型 char 轉換為 int 時出錯。
char*轉換
Qt下面,字元串都用QString,確實給開發者提供了方便,想想VC裡面定義的各種變數類型,而且函數參數類型五花八門,經常需要今年新那個類型轉換
Qt再使用第三方開源庫時,由於庫的類型基本上都是標準的類型,字衫敬符串遇的多的就是Char*類型
在Qt下怎樣將QString轉char*呢,需要用到QByteArray類,QByteArray類的或凳慎說明詳見Qt幫助文檔。
因為char*最後都有一個『/0』作為結束符,而採用QString::toLatin1()時會在字元串後面加上『/0』
方法如下:
Qstring str;
char* ch;
QByteArray ba = str.toLatin1();
ch=ba.data();
這樣就完成了QString向char*的轉化。經測試程序運行時不會出現bug
注意第三行,一定要加上,不可以str.toLatin1().data()這樣一部完成,可能會出錯。
補充:以上方法當QString里不含中文時,沒有問題,但是QString內含有中文時,轉換為char*就是亂碼,採用如下方法解決:
方法1:
添加GBK編粗銀碼支持:
#include <QTextCodec>
QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));
然後改變上面的第三行為:QByteArray ba = str.toLoacl8Bit(); toLoacl8Bit支持中文
方法2:
先將QString轉為標准庫中的string類型,然後將string轉為char*,如下:
std::string str = filename.toStdString();
const char* ch = str.c_str();