FC2ブログ
sqlclr のファンクションで引数の文字列に制限を付ける
こんな感じに引数の前にSqlFact属性を付けてあげるだけ。
そうすると、MSBuildがアセンブリに含まれている属性をみて、公開用のクエリを作ってくれる。
下の例だと、引数hogehogeは1000文字まで受け取って、戻り値は2000文字まで出力しますよって感じ。
NULL許可とか、Decimal型の長さとかもこの属性のプロパティにあるので、それで制御かければOK。
楽ちんだねぇ('A`)y~~~

<SqlFunction(DataAccess:=DataAccessKind.Read)> _
Public Shared Function HogeHoge( <SqlFacet(MaxSize:=1000)> ByVal hogehoge as SqlString ) as SqlString
Return "('A`)ヴァー"
End Function
スポンサーサイト
bcp コマンドでのCSVインポート
ずっと更新してないとあれなので、たまにはね・・・

SQLServerをインストールすると、クライアントアプリとして、bcpっていうアプリがインストールされる。
用途は色々あるのだろうけど、自分は単純にデータの出し入れに使ってたりする。

まずはCSVのインポート

$ bcp DB名.スキーマ.テーブル名 in "CSVファイルパス" -S ホスト名 -U ユーザー名 -P パスワード -t , -c

-t , って命令が、カンマ区切りの文字列ですよという意味
-c で単純な文字列のファイルですよという意味

次にCSVへのエクスポート

$ bcp DB名.スキーマ.テーブル名 out "CSVファイルパス" -S ホスト名 -U ユーザー名 -P パスワード -t , -c

単純に in が out になっただけ。

クエリの結果が出したいんじゃという人は次の命令

$ bcp "クエリ" queryout "CSVファイルパス" -S ホスト名 -U ユーザー名 -P パスワード -t , -c

という感じ
Visual Studio 2012 でのSQLCLR ステップ実行
忘れててはまっちまったぜ('A`)y~~~

Visual Studio 2012を起動して、[SQL Server オブジェクト エクスプローラー]から
SQL/CLRが配置されているDBサーバーを右クリでSQL/CLRのデバッグの許可だ!

なんかステップ実行ができないなと小一時間ほど悩んでた('A`)

              __            Π
        _,.-、    | |  r――'''つ  ┌‐┘ 'ー┐
      ,,-'' _,ノ_   | |  ´ ̄ ̄      ̄/ / ̄        / 〉
    ,,-''  < / /  .| |            / / ヽ二二!   / /
  ,,-''  rヘ `´ / _ | |  /`ー--―┐  / /         / /     r 、
 (_,.イ  ,、ヽ  〈 < ヽL_j  ` ー――‐'  <_/  <´ ー--、  { {__,.、    { i
    }  `  ハ `'´ ノ                 ` ー‐ '  ヽ__ノ    } }
   / r┐ ./ ヽ_,/                     /         / ,/
     ̄ / ./                         /         `"
     <_ノ     ヽ                   /         /
    \        ヽ                            /
      \       ヽ      ____            /
       \           /      \          /
         \         /  _ノ  ヽ、_  \      /
          \      /  o゚⌒   ⌒゚o  \   /
                 |     (__人__)    |
                 \     ` ⌒´     /

あれだな、VSの[SQL Serverプロジェクトファイル]で設定するわけじゃないってのがネックだなw

LocalDBだとこんなことないんだよなぁ。デフォルトでデバッグ許可だし。
これが原因だなwそういうことにしようwww
クエリで時系列で保持されてる変更ログからある特定の日のデータを取得したい
SQLServerならこんな感じかな。

declare @checkedDate datetime;
set @checkedDate = '2099/1/1';

-- Logs 変更履歴テーブルとでもしといてくれ!
-- Id 変更履歴テーブルの行の一意を示す列(数値の連番)
-- Code 何かしらの記号
-- LogDate 変更日

select *
from Logs as log1
where log1.Code = 1
and log1.Id = (select max(log2.Id)
from Logs as log2
where log2.LogDate <= @checkedDate
and log2.Code = ca1.Code )

相関サブクエリっていうのかな?を使って、特定の日より前に追加された最新のログIDを取得し、それを比較対象として使うことで、特定の日のとある行を取得できるわけだ。
説明が下手くそすぎだな・・・('A`)y~~~

テーブルにIDのような一意のものがない場合には、行にランク付をするといい。
次のような感じ。

select dense_rank() over (order by LogDate) as Id, * from Logs

仮想テーブルでも作って、一時的にそこに入れてあげると幸せになれるかも。
ログテーブルが膨大だと洒落にならんかもしれんが('A`)y~~~
SQLServer Express で実行されたクエリをログに出力する
こんなバッチスクリプトだな。.bat ファイルにして、管理者モードで動かせばOK。

net stop "sql server (sqlexpress)"
net start "sql server (sqlexpress)" /T4032
sqlcmd -E -Q "dbcc traceon(3605, -1)"
pause

"sql server (sqlexpress)" っていうのがサービスに登録されているSQLサーバーのインスタンス。
これは環境によって違うので適切な値に変更すること。
わからなかったらコマンドプロンプト開いて、
net start って打つとサービスの一覧が出てくるからそれで調べる。
サービスを一度停止して、トレース4032を設定して起動させる。
次に、管理者モードでSQLServerにログインして、トレース3605を設定する。

トレースログは、インスタンスのインストール先のディレクトリにあるLogディレクトリのERRORLOGという名称で出力される。文字コードはUnicode(UTF-16)なので、適当なツールまたは、スクリプトで見ると幸せになれる。

自分は、tail.vbs っての作って確認してる。そのうちアップしよう('A`)y~~~
TOP
プロフィール

hssamurai

Author:hssamurai
FC2ブログへようこそ!

最新記事
最新コメント

最新トラックバック

月別アーカイブ
カテゴリ