Dapperにて、TVP(テーブル値パラメーター)を扱う

たとえば、以下のようなテーブル定義と、

CREATE TABLE [dbo].[TodoItems](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](50) NOT NULL,
    [IsDone] [bit] NOT NULL,
    CONSTRAINT [PK_TodoItems] PRIMARY KEY CLUSTERED ([Id] ASC)
)

以下のようなユーザー定義テーブル型*1

CREATE TYPE [dbo].[tvpIds] AS TABLE(
    [Id] [int] NOT NULL
)
CREATE TYPE [dbo].[tvpTodoItems] AS TABLE(
    [Name] [nvarchar](50) NOT NULL,
    [IsDone] [bit] NOT NULL
)

さらに、以下のようなストアドプロシージャを定義します。

CREATE PROCEDURE [dbo].[usp_CreateTodoItems] 
    @Items [dbo].[tvpTodoItems] READONLY
AS
BEGIN
  SET NOCOUNT ON;

  INSERT INTO [dbo].[TodoItems]
    ([Name], [IsDone])
  OUTPUT inserted.[Id], inserted.[Name], inserted.[IsDone]
  SELECT [Name], [IsDone]
  FROM @Items;
END
CREATE PROCEDURE [dbo].[usp_DeleteTodoItems] 
    @Ids [dbo].[tvpIds] READONLY
AS
BEGIN
  SET NOCOUNT ON;

  DELETE [dbo].[TodoItems]
  OUTPUT deleted.[Id]
  WHERE [Id] IN (SELECT [Id] FROM @Ids);
END

今回はこの二つのストアドプロシージャをDapperを介して利用する方法を検討します。

*1:すっかり忘れていましたが、PRIMARY KEYとか定義した方が良いと思います

続きを読む

Persisted Computed Columnの計算にユーザー定義関数を用いるとパフォーマンスに悪影響がある

良かれと思ってやったのですが

今までComputed Columnの例ではロジックを分ける意味で、ユーザー定義関数を用いていました。

mrgchr.hatenablog.com

続きを読む

Persisted Computed Columnがなぜか不明瞭になった件

何故これがダメなのかが分からない

先日の消費税計算のComputed Columnを、Persisted指定したら何故かエラーになりました。

テーブル 'Orders' の計算列 'SalesTax' を保存できません。この列は不明確です。

これを解決します。

続きを読む

Computed Columnの計算結果は別のComputed Columnで参照できない

ので、Viewを使おう

タイトルそのまんまなのですが、SQL ServerのComputed Columnの計算結果は別のComputed Columnで参照するとエラーになります。

続きを読む

Persisted Computed ColumnはComputed ColumnよりもSelectが本当に速いのか

本当に速いのか

前回の記事で、SQL ServerのComputed Columnについて、「Persisted Computed Columnの方が当然Selectは速くなる」と書きましたが、Webの情報を鵜呑みにして書いただけで未検証でした。

mrgchr.hatenablog.com

というわけで確認してみました。

続きを読む

SQLServerのComputed Column(計算列)についての備忘録

Computed Column(計算列)について調べました。

Computed Column(計算列)は、SQLServerにて利用できる、テーブルの他の列のデータを元に値を計算する仮想列です。
たとえば、下記のテーブル定義では、FullName列が計算列となります。

CREATE TABLE [dbo].[Accounts]
(
    [Id] INT NOT NULL IDENTITY,
    [FirstName] NVARCHAR (50) NOT NULL,
    [LastName] NVARCHAR (50) NULL,
    [LastNameComesFirst] BIT DEFAULT (0) NOT NULL,
    [FullName] AS (
        CASE WHEN [LastName] IS NULL THEN [FirstName]
             WHEN [LastNameComesFirst] = 0 THEN concat([FirstName], N' ', [LastName])
             ELSE concat([LastName], N' ', [FirstName])
        END), 
    CONSTRAINT [PK_Accounts_Id] PRIMARY KEY ([Id] ASC),
)
続きを読む