マイペース庶民

マイペースで生きたい

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 での挿入先でのカラムの指定はしておこうというそういう話。
そもそものレコードコピーからそうすべきな気もする。

「モバイルGmailから送信」を消す

スマホアプリからGmailを送信してて、勝手に署名ついてめんどいなと思ってた。

よくよく考えれば設定を編集すればあるよね。
Gmailアプリを起動 > メニュー > 設定 > モバイル署名
勿論署名を変えることもできる。
f:id:kino2nd:20150309002827p:plain

PCの方で探してて気づかなかった。
僕みたいな人が誰かしら気付けたら。

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>