oracleのテーブル作成SQLをsqlserverのテーブル作成SQLに変換する際の注意点
1. コメント文は全て削除する必要があります。
2. clob 型を text 型に変換します。
3. BLOB タイプを画像タイプに変換します。
4.数値型はintに変換され、number(16,2)などは10進数(16,2)に変換され、number(18)はbigintに変換されます。
5.デフォルトのsysdateがデフォルトのgetDate()に変更されます。
6.to_date('2009-12-18','yyyy-mm-dd') は Cast('2009-12-18' as datetime) に変更されます
SQLSERVER:
変数の宣言:
次の場合に使用する必要があります変数の宣言 変数の前に @ 記号を追加します
DECLARE @I INT
変数の代入:
変数を代入するときは、変数の前に set を追加する必要があります
SET @I = 30
複数の変数を宣言:
DECLARE @ s varchar(10),@a INT
if ステートメント:
Java コード
if .. begin ... end else if .. begin ... end else begin ... end
例:
SQL コード
DECLARE @d INT set @d = 1 IF @d = 1 BEGIN PRINT '正确' END ELSE BEGIN PRINT '错误' END
複数の条件選択ステートメント:
例:
SQL コード
declare @today int declare @week nvarchar(3) set @today=3 set @week= case when @today=1 then '星期一' when @today=2 then '星期二' when @today=3 then '星期三' when @today=4 then '星期四' when @today=5 then '星期五' when @today=6 then '星期六' when @today=7 then '星期日' else '值错误' end print @week
ループ ステートメント:
Java コード
WHILE 条件 BEGIN 执行语句 END
例:
Java コード
DECLARE @i INT SET @i = 1 WHILE @i<1000000 BEGIN set @i=@i+1 END
カーソルの定義:
SQL コード
DECLARE @cur1 CURSOR FOR SELECT ......... OPEN @cur1 FETCH NEXT FROM @cur1 INTO 变量 WHILE(@@FETCH_STATUS=0) BEGIN 处理..... FETCH NEXT FROM @cur1 INTO 变量 END CLOSE @cur1 DEALLOCATE @cur1
SQL コード
AS declare @CATEGORY_CI_TABLENAME VARCHAR(50) ='' declare @result VARCHAR(2000) = '' declare @CI_ID DECIMAL = 0 declare @num int = 1 declare @countnum int = 1 BEGIN select @countnum = count(ATTRIBUTE_CONFIG_ID) from T_ATTRIBUTE_CONFIG where CMDB_UPDATE_FLAG= 'Y' and CATEGORY_CODE =@CATEGORY_CODE IF (@ATTRIBUTE2='A') begin DECLARE MyCursor CURSOR for select ATTRIBUTE_CONFIG_CODE from T_ATTRIBUTE_CONFIG where CMDB_UPDATE_FLAG= 'Y' and CATEGORY_CODE =@CATEGORY_CODE OPEN MyCursor FETCH NEXT FROM MyCursor INTO @CONFIG_CODE set @result = @result+@CONFIG_CODE+',' WHILE @@FETCH_STATUS = 0 BEGIN FETCH NEXT FROM MyCursor INTO @CONFIG_CODE set @num = @num+ 1 if(@num<@countnum) begin set @result = @result+@CONFIG_CODE+',' end else if(@num=@countnum) begin set @result = @result +@CONFIG_CODE end END CLOSE MyCursor DEALLOCATE MyCursor set @result = 'insert into ' + @ATTRIBUTE1 + '(' + @result +') select '+ @result +' from '+@CATEGORY_CI_TABLENAME +' where CI_ORDER_LINE_ID='+@KEY_ID end else if((@ATTRIBUTE2='U'))
一時テーブル:
-- INTO を選択すると、計算結果から新しいテーブルが作成されます。クエリ。 通常のSelectとは異なり、データはクライアントに返されません。 新しいテーブルのフィールドは、Select の出力フィールドに関連付けられているのと同じ名前とデータ型を持ちます。 * SELECT * Into Newtable
From Uname
--- Insert Into SELECT
-Table ABC は UNAME のフィールドのテーブルに存在する必要があります
--- 一時テーブルを作成します
テーブル #Temp (
) UID int Identity (1, 1) 主キー、
Username Varchar (16)、
PWD VARCHAR (50)、Age Smallint、
Sex Varchar (6)
------------- ----------------------------------- 一時テーブルを開きます
#temp
から * を選択します
2. グローバル一時テーブル (## で始まる) は他の接続にも有効で、現在の接続およびそれにアクセスしていた他の接続が切断されると自動的に削除されます。
3. ローカル一時テーブルかグローバル一時テーブルかに関係なく、接続にアクセス権がある限り、drop table #Tmp (またはdrop table ##Tmp) を使用して一時テーブルを明示的に削除できます。
一時テーブルは、過剰でない限り、実行効率にほとんど影響を与えません。逆に、データベースの一時テーブル領域が十分である限り、効率を向上させることができます。実行効率に影響しますので、可能であれば避けてください。
その他:
-- 入力パラメータを含むストアド プロシージャ --
create proc GetComment
(@commentid int)
as
select * from Comment where CommentID=@commentid
-- 入力ストア付き出力パラメータを持つプロシージャ--
create proc GetCommentCount
@newsid int,
@count int Output
as
select @count=count(*) from Comment where NewsID=@newsid
- -単一の値を返す関数--
create function MyFunction
(@newsid int)
returns int
as
begin
declare @count int
select @count=count(*) from Comment where NewsID=@newsid
return @count
end
--メソッドの呼び出し--
declare @count int
exec @count=MyFunction 2
print @count
--戻り値Aテーブルの関数 --
関数 GetFunctionTable
(@newsid int) を作成します
returns table
as
return
(select * from Comment where NewsID=@newsid)
-- 戻り値is Table function call--
select * from GetFunctionTable(2)
---------------------------- - ------------------------------------------------- - ------------------------------------------------- - --
SQLServer は、複数条件クエリを実装するためにストアド プロシージャ内の SQL 文字列を結合しません
前のスプライシング方法
set @sql=' select * from table where 1=1 '
if (@addDate is not null)
set @sql = @sql+' and addDate = '+ @addDate + ' '
if ( @name '' and is not null)
set @sql = @sql+ ' and name = ' + @name + ' '
exec(@sql)
以下は SQL 文字列を結合しない複数条件クエリです解決策
最初の書き方はコードが少し冗長に感じることです
if (@addDate is not null) and (@name '')
select * from table where addDate = @addDate and name = @ name
else if (@addDate is not null) and (@name ='')
select * from table where addDate = @addDate
else if (@addDate is null) and (@name '')
select * from table where and name = @name
else if(@addDate is null) and (@name = '')
select * from table
2番目の書き方は
select * from table where (addDate = @ addDate or @addDate is null) and (name = @name or @name = '')
3番目の書き方は
SELECT * FROM table where
addDate = CASE @addDate IS NULL THEN addDate ELSE @addDate END,
name = CASE @name WHEN '' THEN name ELSE @name END
--------------------------------- -------- -------------------------------------- -------- -------------------------------------- --
SQLSERVER ストアド プロシージャ 基本構文
1. 変数の定義
-- 単純な代入
declare @a int
set @a=5
print @a
-- 使用する値を割り当てる select ステートメント
declare @user1 nvarchar (50)
select @user1='Zhang San'
print @user1
declare @user2 nvarchar(50)
select @user2 = ID= の ST_User からの名前1
print @user2
- - update ステートメントを使用して値を割り当てます
declare @user3 nvarchar(50)
update ST_User set @user3 = Name where ID=1
print @user3
2テーブル、一時テーブル、テーブル変数
-- 一時テーブル 1 を作成します
テーブル #DU_User1 を作成します
( [ID] [ int ] NOT NULL ,
[Oid] [ int ] NOT NULL ,
[ログイン] [nvarchar](50) [Rtx] [nvarchar](4) NOT NULL 、
[名前] [nvarchar](5) NOT NULL 、
[パスワード] [nvarchar]( max ) NULL 、
[状態] [nvarchar](8) NOT NULL
);
-- 一時テーブル 1 にレコードを挿入します
#DU_User1 (ID,Oid,[Login],Rtx, Name,[Password],State) 値に挿入します(100,2, 'LS ' ,'0000' , 'Temporary' , '321' , 'Special' );
-- ST_User からデータをクエリし、新しく生成された一時テーブルに入力します
select * into #DU_User2 from ST_User where ID
-- 2 つの一時テーブルをクエリして結合します
select * from #DU_User2 where ID
-- 2 つの一時テーブルを削除します
テーブル # DU_User1 を削除
テーブル # DU_User2 を削除
--一時テーブルを作成
CREATE TABLE #t
(
[ID] [ int ] NOT NULL ,
[Oid ] [ int ] NOT NULL 、
[ログイン] [nvarchar]( 50) NOT NULL 、
[nvarchar](4)
[state] [nvarchar](8)not null、) -クエリ結果セット(複数のデータ)を一時テーブルに挿入してください。 * from ST_User --このように挿入できません --select * into # t from dbo.ST_User --int 型の自動増加サブセクションの列を追加します alter table #t add [myid ] int NOT NULL IDENTITY(1,1) --列を追加し、デフォルトで世界を埋める 一意の識別子 alter table #t add [myid1] uniqueidentifier NOT NULL default (newid()) select * from #t drop table #t -- クエリ結果セットに自動増加列を追加します -- 主キーがない場合: IDENTITY(int,1,1) を ID として選択します、名前、[ログイン]、[パスワード] を ST_User から #t に入力します select * from #t--はい 主キー: select (ST_User から SUM (1) を選択します (ID -- テーブル変数を定義します declare @t table
( id int not null , msg nvarchar(50) null ) @t に挿入値 (1, '1' ) @t に挿入 値 (2, '2' ) select * from @t 3. ループ -- while ループは 1 から 1 までの合計を計算します100 declare @a int declare @ sum int set @a=1 set @ sum =0
while @abegin set @ sum +=@a set @a+=1 end print @ sum 4. 条件文
--if,else 条件分岐 if(1+1 =2) begin print 'right' end
else begin print 'wrong' end --when then 条件分岐 declare @today int declare @ Week nvarchar(3) set @today=3 @を設定week = case @ @ @today = 1 then 'manday' when @ @today = 2 then 'today' when @today = 3 then 'can' can 'can' can 'else' else 'valueエラーprint @week 5. Cursordeclare @ID int declare @Oid int declare @Login varchar (50 ) -- カーソルを定義します
select ID の user_cur カーソルを宣言します,オイド,ST_User から [ログイン] -- カーソルを開く user_cur を開く
@@ fetch_status = 0カーソル
deallocate user_cur 6. トリガー トリガー内の一時テーブル: 挿入挿入と更新操作後にデータを保存する
削除削除と更新操作の前にデータを保存する データ
--トリガーの作成作成クレア@msg nvarchar(50)
--@msg レコードの変更
select @msg = N ' 名前が "' + Deleted. Name + N '" から "' + Inserted. Name + '"' fromInserted,削除済み
-- トリガー drop トリガー User_OnUpdate 7. ストアド プロシージャ
-- 出力パラメーターを使用してストアド プロシージャを作成します
CREATE PROCEDURE PR_Sum
@a int ,
@b int 、
@ sum int 出力
AS
BEGIN
set @ sum =@a+@b
END
--戻り値ストアド プロシージャの作成
CREATE PRO CEDURE PR_Sum2
@a int ,
@b int
AS
BEGIN
Return @a+@b
END
--ストアドプロシージャを実行して出力タイプの戻り値を取得します
declare @mysum int
execute PR_Sum 1,2,@mysum Output
print @mysum
8. カスタム関数 関数の分類: 1) スカラー値関数 2) テーブル値関数 a: インラインテーブル値関数 b: 複数のステートメントテーブル値関数 3) システム関数 -- 新しいスカラー値関数create function FUNC_Sum1 ( @a int , @b int ) returns int としてbegin return @a+@b end -- 新しいインライン テーブル値関数 create function FUNC_UserTab_1 ( @myId int )
テーブル を return として返します(select * from ST_User where ID- - 新しい複数ステートメントのテーブル値関数 create function FUNC_UserTab_2 ( @myId int ) returns @t table ( ] nullではない、
[[ログイン] [nvarchar] (50) null ではありません、
[rtx] [nvarchar] (4) null ではありません、 [名前] [nvarchar] (5) null ではありません、 [パスワード] [nvarchar] ( nvarchar] (nvarchar] (nvarchar] (nvarchar] (nvarchar] max ) NULL , [State] [nvarchar](8) NOT NULL ) as begin insert into @t select * from ST_ User where ID return end-- テーブル値関数を呼び出す select * from dbo.FUNC_UserTab_1(15) -- スカラー値関数を呼び出す declare @s int
set @s=dbo.FUNC_Sum1(100,50) print @s -- スカラー値関数を削除 drop function FUNC_Sum1 カスタム関数とストアド プロシージャの違いについて話しましょう: 1. カスタム関数: 1. テーブル変数を返すことができます 出力パラメータは使用できません; 関数内の操作は外部環境に影響を与えることができません。 select では結果セットを返せない; データベーステーブルの更新、削除はできない ; 3. スカラー値かテーブル変数を返さなければならない カスタム関数は再利用性が高く、関数が単純で強力な場所でよく使用されます。競争。 2. ストアドプロシージャ 1. テーブル変数を返すことはできません 2. 制限はほとんどありませんが、データベーステーブルに対して操作を実行でき、データセットを返すことができます 3. スカラー値を返すことができ、リターンは省略可能ですストアド プロシージャは通常、複雑な関数とデータ操作を実装するために使用されます。 ---------------------------------------------- --- --------------------------------------------------- --- ----------------------------------SqlServer ストアド プロシージャ -- 例例 1:単一のレコードセットのストアド プロシージャのみを返します。 テーブル銀行預金テーブル(bankMoney)の内容は以下の通りです
要件1: テーブルbankMoneyの内容をクエリするストアドプロシージャ
createプロシージャsp_query_bankMoneyas
select * from BankMoneygo
exec sp_query_bankMoney
注* 使用中は、T-Sql 内の SQL ステートメントをストアド プロシージャ名に置き換えるだけで済み、とても便利です。
例 2 (ストアド プロシージャにパラメータを渡す):
を暗号化付き --------暗号化
asBankMoney (id,userID,sex,Money) に挿入します
Values(@param1,@param2,@param3, @param4) SQL Server の userID='Zhangsan' の BankMoney から @param5=sum(Money) を選択します
go
クエリ アナライザーでこのストアド プロシージャを実行するメソッドは次のとおりです:
declare @total_price int
exec insert_bank '004','Zhangsan','M',100,@total_price Output
print '合計残高は'+convert(varchar ,@ total_price)
go
ここでは、ストアド プロシージャの 3 つの戻り値について説明します (この例を見ている友人が構文の内容を確認する必要がないように):
1. Return 付きの整数
2. 出力形式の戻りパラメータ
戻り値の違い:
output と return はバッチ プログラム内の変数を使用して受け取ることができますが、レコードセットは実行するクライアントに返されます。バッチ。
例 3: 複雑な SELECT ステートメントでの単純なプロシージャの使用
次のストアド プロシージャは、4 つのテーブルの結合からすべての著者 (名前が指定されている)、出版された書籍、および出版社を返します。このストアド プロシージャはパラメータを使用しません。
USE pubs
IF EXISTS (SELECT name FROM sysobjectsWHERE name = 'au_info_all' AND type = 'P')
DROP PROCEDURE au_info_allGO
CREATE PROCEDURE au_info_allAS
SELECT au_lname, au_fname, title, pub _name
著者から内部結合タイトル著者 ta
内部結合タイトルオン
au_info_all ストアド プロシージャは次の方法で実行できます:
EXECUTE au_info_all
-- または
EXEC au_info_all
プロシージャがバッチ内の最初のステートメントである場合は、次のコマンドを使用できます:
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 タイトル t
use using using ta. _info ストアド プロシージャには、次のメソッドが実行されます:
EXECUTE au_info 'Dull', 「アン」
-- または
EXECUTE au_info @lastname = 'Dull', @firstname = 'Ann'
EXECUTE au_info @firstname = 'Ann', @ lastname = 'Dull'
-- またはEXEC au_info 'Dull', 'Ann'
-- または
EXEC au_info @lastname = 'Dull', @firstname = 'Ann'
-- Or
EXEC au_info @firstname = ' Ann', @lastname = 'Dull'
プロセスがバッチ内の最初のステートメントである場合、次を使用できます:
au_info '鈍い'、'アン'
-- または
au_info @lastname = '鈍い'、@firstname = 'アン'
au_info @firstname = 'アン'、@lastname = '鈍い'
例 5: ワイルドカード パラメーターを使用した単純なプロシージャの使用
CREATE PROCEDURE au_info2
@ lastname varchar(30) = 'D%',@firstname varchar(18) = '%'
ASSELECT au_lname, au_fname, title, pub_name
FROM 著者 a INNER JOIN titleauthor ta ON a.au_id = ta.au_id INNER JOIN タイトル 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%'
EXECUTE au_info2 @firstname = 'A%'
-- OrEXECUTE au_info2 '[CK]ars[ OE ]n'
-- Or
EXECUTE au_info2 'Hunter', 'Sheryl'
-- Or
EXECUTE au_info2 'H%', 'S%'
= 'proc2'
例 6: if...else
ストアド プロシージャ。更新を実行するための選択基準として @case が使用され、実行中に渡されるパラメーターに従ってさまざまな変更を実装するために if...else が使用されます。
-- 以下は、 if...else のストアド プロシージャ :if 存在する (select 1 from sysobjects where name = 'Student' and type ='u' )
drop table Studentgo
if存在する (select 1 from sysobjects where name = 'spUpdateStudent ' そして ='p' と入力します)
drop proc spUpdateStudent
go
create table Student
(
fName nvarchar (10),
fAge
smallint ,
fDiqu varchar (50),
fTel int
)
go
Student の値 ('X.X.Y ' , 28, 'Tesing' , 888888) に挿入します
go
create proc spUpdateStudent
(
@fCase int ,
@fName nvarchar (10),
@fAge smallint ,
@fDiqu varchar (50),
@fTel int
)
as
update Student
set fAge = @fAge, -- fAge を更新するために 1,2,3 を渡します。ケース
fDiqu = (@fCase = 2 の場合、または@fCase = 3 then @fDiqu else fDiqu end ),
fTel = (case when @fCase = 3 then @fTel else fTel end )
where fName = @fName
select * from Student
go
-- 年齢のみ変更
exec spUpdateStudent
@fCase = 1,
@ fName = N'X.
@fAge = 80、
@fDiqu = N'Update' 、
@fTel = 1010101