SSMSのインストールに手間取った話
山の日なので、SSMS(SQL Server Manegement Studio)をインストールしていました。
マシンは数年前のLenovoのノートPC、OSはWindows10(更新したやつ)
インストールしてもこけます。
0x80070643 が出ました。残念です。エラーメッセージを見るとzh-Hansとか書いてあって、日本やねんけどと悲しい気持ちに。
エラーが起きているのはReport Viewerのインストールに失敗するからであることが、C:\Users\user_name\AppData\Local\Temp\SsmsSetup配下のログを見ることで分かりました。
依存パッケージがあるときに、そのインストールでこける場合には、事前にそのインストールを済ませることで、スキップされます。
てなわけで、SQL Server 2016 Feature Pack からReport Viewerを先にインストールしました。Report ViewerにもClrTypesと言う依存パッケージがあるので注意です。
その後のSSMSのインストールは無事済みました。良かった良かった。
SQL Server のVIEWのカラム定義を出力する
Management Studio から確認する、以上。
なんてめんどくさい。
以下のクエリはビュー名、カラム名、型、長を出力する。
where句を適当にいじって使う。
-- SQL SERVER 2008以降なら SELECT OBJ.name, COL.name, TYP.name, COL.max_length FROM sys.objects OBJ JOIN sys.columns COL ON OBJ.object_id = COL.object_id JOIN sys.types TYP ON COL.system_type_id = TYP.system_type_id WHERE OBJ.type = N'U' and OBJ.name like 'view_name' AND TYP.user_type_id <> 256 --sysnamesを除く ORDER BY OBJ.name, COL.column_id; -- それ以前なら SELECT OBJ.name, COL.name, TYP.name, COL.length FROM sysobjects OBJ JOIN syscolumns COL ON OBJ.id = COL.id JOIN systypes TYP ON COL.xtype = TYP.xtype WHERE OBJ.type = N'U' and OBJ.name like 'view_name' AND TYP.xusertype <> 256 --sysnamesを除く ORDER BY OBJ.name, COL.colid;
SQL ServerのVIEWにORDERを指定する
そもそもVIEWにORDERを指定することの是非は置いといて、SQL ServerのVIEWに順序を指定してみよう。
方法は2通り
-- 方法その1:TOP 100 PERCENT CREATE VIEW ordered_view AS SELECT TOP 100 PERCENT * FROM base_tbl ORDER BY col_1, col_2, col_3; -- 方法その2:OFFSET 0 ROWS CREATE VIEW ordered_view AS SELECT * FROM base_tbl ORDER BY col_1, col_2, col_3 OFFSET 0 ROWS;
ここからが重要
方法その1は
SQL SERVER 2000:利用可能
SQL SERVER 2005(2008):修正プログラム適用+トレースフラグ有効化+データベースの互換性レベル変更で利用可能
SQL SERVER 2012:利用不可
方法その2も
SQL SERVER 2012で利用可能なことは確認できるけど
いつか利用できなくなるんじゃないでしょうか。
OFFSET-FETCHも2012導入だし、修正入るだろうなと思います。
といかOFFSET-FETCHのおかげでページングが分かりやすくて捗る。
よくわからんでTOPを多用してたのが恥ずかしい。
参考リンク
DO’s&DONT’s #13: 絶対にやってはいけないこと - ORDER BY が指定されていないクエリの結果が一定の順番に並んでいると仮定すること - Microsoft SQL Server Japan Support Team Blog - Site Home - MSDN Blogs
[FIX] SQL Server 2008 で ORDER BY 句を使用したビューを使用してクエリを実行しても結果がランダムな順序で返される
OFFSET FETCH 句 (SQL Server Compact)
SQL Server のレコードコピーとIDENTITY_INSERT
SQL Serverでのテーブルコピーは
SELECT * INTO new_tbl FROM old_tbl;
レコードコピーは
INSERT INTO to_tbl SELECT * FROM from_tbl;
ところでSQL ServerではIDENTITYっていうもんがあって
IDENTITYを持つカラムに明示的に値を入れる場合には
SET IDENTITY_INSERT ON INSERT INTO target_tbl(***, ***, ***,,) VALUES (***, ***, ***,,); SET IDENTITY_INSERT OFF
とするのだが
IDENTITYのあるテーブルにレコードコピーする際
SET IDENTITY_INSERT ON INSERT INTO to_tbl SELECT * FROM from_tbl; SET IDENTITY_INSERT OFF
こんなんやると怒られる。
以下のように書き換える。
SET IDENTITY_INSERT ON INSERT INTO to_tbl(***, ***, ***,,) SELECT * FROM from_tbl; SET IDENTITY_INSERT OFF
INSERT INTO での挿入先でのカラムの指定はしておこうというそういう話。
そもそものレコードコピーからそうすべきな気もする。
PowerShell覚書(調査)
なんかいじりたいときに
- コマンド取得
Get-Command # 一覧
- エイリアス取得
Get-Alias # 一覧 Get-Alias ?? # 二文字のエイリアス Get-Alias -def Get* # 定義がGetから始まるエイリアス
- オブジェクト取得
(ls)[0].GetType() (date).GetType()
- メンバー取得
ls|Get-Member date|Get-Member -type Property
- プロパティ取得
ls | Select-Object Name,Length,IsReadOnly
- ソート
ls | Select-Object Name,Length | Sort-Object Length
- グルーピング
ls | Group-Object Extension
JSPでセッション表示
これも参照用
以下に貼っとく
<%@ page import = "java.util.*" %> <% String res = "" ; res = "キー:値<br>"; Enumeration e = session.getAttributeNames(); while (e.hasMoreElements()){ String oneKey = (String)e.nextElement(); res = res + oneKey + ":" + session.getAttribute(oneKey) + "<br>"; } %> <html> <header></header> <body> <p><%=res%></p> </body> </html>