makoラボ

日常や勉強会や技術ネタ

SQLServerでCREATE VIEWをsp_executesqlで実行する時にパラメータつけれない

環境はSQLServer2014

SQLServerでどうしてもCREATE VIEWの構文を文字列で組み立てて、sp_executesqlで実行しないといけない場合があったとしてます。 以下のようにするとエラーが発生します。

DECLARE @userName AS NVARCHAR(MAX) = 'YAMADA'
DECLARE @mySql NVARCHAR(MAX) = '
  CREATE VIEW YAMADA AS
  SELECT
    *
  FROM
    MEMBER
  WHERE
    LastName = @name
'

EXECUTE sp_executesql @mySql, N'@name AS VARCHAR(MAX)', @name = @userName

エラー内容はこちら

Incorrect syntax near the keyword 'VIEW'.

日本語だと

キーワード 'VIEW' 付近に不適切な構文があります。

色々と調べてみるとこのやり方じゃダメっぽい

Create View using sp_executesql

stackoverflow.com

上記のリンクに書いてあるようにこちらの書き方だとエラーが発生するようです。

以下のように書けば一応実行できますが、@userNameが外部から入力できる場合はSQLインジェクションの可能性があるのでダメですね・・・

DECLARE @userName AS NVARCHAR(MAX) = 'YAMADA'
DECLARE @mySql NVARCHAR(MAX) = '
  CREATE VIEW YAMADA AS
  SELECT
    *
  FROM
    MEMBER
  WHERE
    LastName = ' + @userName  + '
'

EXECUTE sp_executesql @mySql

一旦、ワークテーブルに突っ込む等別の方法を考える方が良さそうです。

合同勉強会 in 大都会岡山 - 2015 Winter -に参加&登壇してきた

ブログを書くまでが勉強会ということで、既に何日か経ってますが参加ブログを。

というわけで、合同勉強会と忘年会議に参加して、今年はショートセッションでお話してきました。

当日の様子は以下につぶやきがまとめられてるのでご覧ください。

togetter.com

当日の発表内容

www.slideshare.net

当日は、「そんな運用で大丈夫か。大丈夫じゃない大問題だ。神は言っているgit-flowを使えと。」というちょっと元ネタが古いタイトルで話してきました。

タイトルにgit-flowって入ってますが実際はちらっと出てくるだけであんまり出てきません。(git-flowの話を期待してた人ごめんなさい) git-flowを導入するなど開発フローを改善した時に社内でやった事を中心にお話しました。

発表中にもお話したのですが、人間使うツールに対して不安があるとなかなか使うことが出来ないかと思います。いくら良いツール、良い開発フローだったとしても使われないと意味がありません。

社内で開発フローを改善しようとなった時に出てきたのも、使っているツールgitへの不安感でした。 まずはその不安感がなくならない限りgit-flowを導入したとしても上手く行かなかったかと思います。

僕らがまずやったのはgitの操作の復習と不安に思っている事を実際に試してみることでした。 gitの操作の復習も良かったのですが、個人的には不安に思ってることを練習リポジトリでとことんやってみたのが効果が高かったのではないかなと思っています。練習リポジトリで色々試したおかげでgit-flowもすんなりと導入できたのかなと思います。

つい、すぐにツールや開発手法等を開発現場に入れたくなってしまいますが、一旦落ち着いてメンバーにツールに対して不安感や疑問に思う所が無いか聞いてみたり、練習の場を設けてみる事でより導入しやすくなるかと思います。

参加してみた感想

今回はいつも以上にバラエティ豊かな発表のメンツだったと思います。 言語やツールの話から、チームの話等々の、色々な方面のお話が聞けて個人的には刺激になりました。

個人的に気になってたギークハウス岡山。去年の合同勉強会で住人募集LTしていた所から1年でTVに出たり住人も増えたようで良かったです。

発表者に県外勢も多かったですし、参加者の県外勢もいつもより多かったし盛り上がりもここ数年で一番だったんじゃないかなと。毎年企画してくれるもじゃさんありがとうございます!

来年は5周年なので更に盛り上がるといいですね!

Okayama.rb #100 『祝100回記念スペシャル!』に参加してきた

毎週木曜日に、ココスに集まってハンバーグを食べてきたRubyに関する何かを行ってきたOkayama.rbですが100回を迎える事が出来ました。

それを記念して開催されたOkayama.rb #100 『祝100回記念スペシャル!』に参加して来ました。

発表してきた

せっかくなので何かしゃべるかということで、joinsを使った時にエラーになった話をしました。

ちょっとだけ内容の話を。

別々のデータベースを使用しているテーブルのモデル同士でjoinsを使用した場合にエラーになります。

考えてみれば別データベースなのでjoin出来ないので、当然といえば当然かなと。

eager_loadもjoinするのでだめ、includesも条件によってはeager_loadを呼ぶので一応除外。

それぞれのテーブルにクエリを投げるpreloadであれば問題なくそれぞれのデータを取得できるので、今回はこちらを採用しました。

おわり

今週は100回記念ということで土曜日のスペシャルバージョンでしたが、来週からは通常営業になります。 ちょとご飯を食べながらRubyやプログラミングの話をしたいなって方はぜひ参加していただければ!

okaruby.doorkeeper.jp

第18回 岡山Ruby, Ruby on Rails勉強会で発表してきた

久しぶりに開催された岡山Ruby, Ruby on Rails勉強会でKnokout.jsについて発表してきました。

最近の業務でKnokout.jsを使ってるのですが、今までjQueryで書いてた表示・非表示処理やらがすっきりかけるのがいいですね。JS用のクラスを付けなくてもいいし・・・

Knokout.jsはJSライブラリなので既存のプロジェクトも入れやすいので、jQueryのドム操作で疲弊している人ぜひ使ってみてください。

Dapperでテーブル値パラメータを使う

今関わっているプロジェクトでDapperを使ってるのですが、ストアドにテーブル値パラメータを使おうと思った時にちょっと分からなかったので調べてみました。

こちらのスタックオーバーフローにも書かれているようにDataTableを使えば渡せるようです。

例えば下記の様な定義のストアドがあった場合

CREATE TYPE dbo.UserTableType AS TABLE
    ( UserID int, UserName nvarchar(50) )

CREATE PROCEDURE spAddNewUser 
    (@tvpNewUser dbo.UserTableType READONLY)

Dapperでテーブル値パラメータを渡す場合のコードは

// パラメータとして渡すようにDataTableを準備
DataTable userTable = new DataTable();

userTable.TableName = "tvpNewUser";
userTable.Columns.Add("UserID", Type.GetType("System.Int32"));
userTable.Columns.Add("UserName", Type.GetType("System.String"));

// 登録するデータをDataTableにセット
for (int i = 1; i < 4; i++)
{
    DataRow row = dt.NewRow();
    row["UserID"] = i;
    row["UserName"] = "新しいユーザ" + i;
    dt.Rows.Add(row);
}

// パラメータとしてDataTableを渡してストアドを実行する
var data = connection.Query<SomeType>("spAddNewUser", new { tvpNewUser = userTable
}, ...);

こんな感じでDataTableを作成して渡せばちゃんとストアド側でパラメータとして受け取れるようです。

でもなんかスマートじゃないのでもうちょっとうまいこと出来ないものか・・・

第29回 岡山WEBクリエイターズ「年末スペシャル2014」で話してきた

これは大都会岡山 Advent Calendar 2014の20日目の記事です。土曜日担当も今日が最後です。

前日は@patorashさんのお家紹介完結編でしたでした。 #ぱとしお新居ツアッーの開催が待たれますね!(2回め)

第29回 岡山WEBクリエイターズ「年末スペシャル2014」で話してきた

はい。我らが軍団長に重圧をかけられながら発表してきました。

死霊は諸事情で公開出来ないのですが、BootstrapのJavaScriptライブラリ便利だよーという話をしてきました。

伝えたかったこと

この辺りが伝わっていればいいなと思います。

あともう一つ

12/22にボクがフロント周りを担当したクレオフーガがリニューアルOPENするステマをしてきました。

みなさんお手柔らかにお願いします・・・

明日は!

明日は大都会が誇るリーサルウェポンきよくらさんです。

昼休みにイオン岡山に行って来た

f:id:mako_wis:20141210121134j:plain

これは大都会岡山 Advent Calendar 2014の13日目の記事です。

前日は@patorashさんのお家自慢でした。 #ぱとしお新居ツアッーの開催が待たれますね!

さて本題です。 いま岡山でもっとも熱い話題といえばもちろんイオン岡山OPENhttp://aeonmall-okayama.com/ですよね! ということで、先日のお昼休みに突撃してきました。

巨大な吹き抜け

f:id:mako_wis:20141210122407j:plain

まず印象的なのは建物中心部にある1階から4階までの吹き抜け空間です。 写真に写ってる巨大なスクリーンには、たまに店内を取材している様子が映し出されていたりします。 吹き抜けの周りには休憩用のイスやそれに付随する軽食店が並んでいて、のんびりするには良いエリアです。

空中庭園

f:id:mako_wis:20141210121841j:plain

吹き抜けがある4階層を抜けて5階に行くと現れるのが空中庭園です。 周りにはカフェとかもあったりするので春とかにのんびりするにはいい感じですね。今の季節だと寒いですが・・・

夜はライトアップ

f:id:mako_wis:20141130183407j:plain

夜はこの空中庭園がライトアップされます。こちらも綺麗なので夜にブラっと立ちよるのもいいかもしれませんね。 ※別の日に撮影しました

まとめ

昼休みに出かけたのであまり店内を見て回れなかったのが少し残念でした。 まだ、オープンしてすぐの週だったせいか平日の昼にもかかわらず人が多かったです。 飲食店街も人が多くて行列が出来てたりとかして、お昼休みに食べに行くならちょっと時間をずらして行った方が良さそうです。

今回紹介した以外にも沢山の店舗があったりとか、TV曲のスタジオがあったりするイオン岡山。 岡山駅周辺にありますので、駅に立ち寄った際にブラっと立ち寄ってみてはいかがでしょうか?

明日は@bleu48さんです