Claris FileMaker と SQL Serverをリンクサーバーで繋ぐ

# はじめに
Claris FileMaker と SQL Serverをリンクサーバーで繋いでみました。

:::note info
リンクサーバーで接続する事は成功しましたが、Insert、Updateができず断念しました。しかし、Selectは可能であるため、SQL Serverにデータを流し込みたい場合には非常に有用な手段ではないかと考えています。

**※ この連携を行い半年が経ちましたが非常に安定して動作しています。**
:::

## 構成
OS：Windows 11 Pro
SQL Server 2019
Claris FileMaker 2023

## ODBCドライバのインストール

[FileMaker xDBC クライアントドライバ](https://support.claris.com/s/article/Software-Update-FileMaker-xDBC-client-drivers-for-FileMaker-1503692806454?language=ja)より、ODBCドライバをダウンロードし、インストールを行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119455/73e56d82-f5f7-24ff-d60d-b5e2b587b321.png)

## データソースの新規作成
インストールが完了すると、データソース上にFileMaker ODBCの項目が現れます。

:::note info
データソースの作成は64bit版となります。
**※ 32bit版では出てきません。**
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119455/5370eb81-4cec-c325-05c9-fef46554ce66.png)

## FileMaker DNSの構成

### 名前と説明の入力

:::note info
名前はリンクサーバー名に利用されます。
説明は不要です。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119455/0dc6be5b-d34e-164b-1477-d0cd5a08a775.png)

:::note info
**ホストに接続して使用可能なデータベースの名前を取得する。** にチェックをつけなくても問題ないです。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119455/6cb9db79-280c-3a58-6a2d-cb0db4021408.png)

先程の**ホストに接続して使用可能なデータベースの名前を取得する。** のチェックを入れると、自動的にデータベース名が表示されます。


:::note info
**テキストフィールドをlong varcharとして記述** に必ずチェックを入れてください。
:::


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119455/942d9741-ed20-4d61-fd27-eaf6119e2069.png)

ここで **「テキストフィールドをlong varchar として記述」** にチェックを入れます。
その後、テスト接続を行い問題なければ画面を閉じます。

# リンクサーバーの設定
SQL Serverでリンクサーバーを作成します。
ページの選択の全般より、以下の項目を設定します。

* リンクサーバー：FM_HOGEHOGE
* プロバイダー名：Microsoft OLE DB Provider for ODBC Drivers
* データ ソース：**hogehoge**

:::note info
データ ソースの **hogehoge** は **「FileMaker DNSの構成」** で作成した名称です。

:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119455/a47d8df7-9f03-d3b9-e388-ff4acbc0560b.png)


### FileMaker側に接続するユーザーIDとパスワードを入力
セキュリティの項目で **このセキュリティ コンテキストを使用する** に変更し、FileMakerに接続するユーザーIDとパスワードを入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119455/a39735fa-bc05-060c-b81a-d685d1420f35.png)


設定が完了し、接続するとリンクサーバーの接続確認で以下のメッセージが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119455/31a36f83-97f7-9a0d-bb34-583380fc6a10.png)

# FileMakerからデータを取得する

### 接続方法
FileMakserと接続するには[OPENQUERY (Transact-SQL)](https://learn.microsoft.com/ja-jp/sql/t-sql/functions/openquery-transact-sql?view=sql-server-ver16)を利用します。

今回の例だと、以下のSQL文で取得することができます。

``` SQL
SELECT * FROM OPENQUERY (FM_HOGEHOGE, 'SELECT * FROM "ほげほげ"'); 
```

### FileMakerのSQL文に合わせる
FileMakerのSQL文は列名等をダブルクォーテーションで囲む必要があります。この辺りの仕様は公開されているのでドキュメントを確認してください。
[SELECT ステートメント](https://help.claris.com/ja/sql-reference/content/select-statement.html)

### 参考
FileMakerから取得したクエリデータはTEXT型として扱われるため、NVARCHAR型などSQL Server側で明示的に扱いやすいデータ型に変換して利用したほうが扱いやすいです。

参考委程度ですが、データ取得時のサンプルSQLを記載します。

``` SQL
SELECT
  REPLACE(REPLACE(TRIM(UserName),' ',''),'　','')  AS UserName
 ,REPLACE(REPLACE(TRIM(UserAddr),' ',''),'　','')  AS UserAddr 
 ,REPLACE(REPLACE(TRIM(UserTel),' ',''),'　','')   AS UserTel 
FROM
(
  SELECT
    CONVERT(NVARCHAR,ISNULL(氏名,'')) AS UserName
   ,CONVERT(NVARCHAR,ISNULL(住所,'')) AS UserAddr
   ,CONVERT(NVARCHAR,ISNULL(電話,'')) AS UserTel
  FROM OPENQUERY (FM_HOGEHOGE, 'SELECT * FROM "ほげほげ"')
) AS A
```

:::note info
FileMaker DNSの構成時に **テキストフィールドをlong varcharとして記述** にチェックを入れましたが、実際にはNVARCHAR型ではなくTEXT型として解釈されるようです。
:::