こんな感じでOK
SELECT * FROM TABLE_NAME WHERE FIELD_NAME LIKE '%\[%' ESCAPE '\'
例えばA5M2でエクスポートしたExcelファイルのデータをそのままSQL ServerにインポートするとNULL値が、「« NULL »」という文字列で保存されてしまうことがある。
このとき、対象のレコードを抽出したい場合に以下のようなSQLを書いても取得できない。
SELECT * FROM TABLE_NAME WHERE FIELD_NAME = '« NULL »'
この場合は、検索したい文字列の先頭に「N」を付ければOK
SELECT * FROM TABLE_NAME WHERE FIELD_NAME = N'« NULL »'
なので、Updateしたい場合も以下のように書けばOK
UPDATE TABLE_NAME SET FIELD_NAME = null WHERE FIELD_NAME = N'« NULL »'
※データ型がnvarcharの場合
/* 1111111100000000 FF00(16進数) 1110101011011011 60123(10進数) -------------------------------------- 1110101000000000 59904(10進数) AND演算結果 1111111111011011 65499(10進数) OR演算結果 */ select CAST(0xFF00 as int) & 60123 as [AND演算], CAST(0xFF00 as int) | 60123 as [OR演算]
&(AND)と|(OR)の記号を利用する。
上記の例では、見やすいように16進数で記載する例も併せて載せている
System.Data.SqlClient.SqlException: SQL Server への接続を確立しているときにネットワーク関連またはインスタンス固有のエラーが発生しました。サーバーが見つからないかアクセスできません。インスタンス名が正しいこと、および SQL Server がリモート接続を許可するように構成されていることを確認してください。 (provider: SQL Network Interfaces, error: 26 - 指定されたサーバーまたはインスタンスの位置を特定しているときにエラーが発生しました)
そもそもIDやPWを間違えている場合なども考えられるが、今回はSQL Server上の「SQL Server Browser」サービスが起動していないことが原因だった。
SQL Server上のManagement Studioからだとこのサービスが起動していなくても接続できたので、気付きにくい。
@の位置を取得して、その前後を取得すればOK。
/*サンプルテーブル*/ with sampleTable as ( select 'hoge@example.com' as mailAddress union select 'hoge2@example.com' union select 'invalid_address' ) select mailAddress as [メールアドレス], /*@より前の値を取得する*/ substring(mailAddress, 0, charindex('@',mailAddress)) as [ローカルパート], /*@より後の値を取得する(末尾は適当に長くしている…)*/ substring(mailAddress, charindex('@',mailAddress) + 1, 999) as [ドメインパート] from sampleTable where /*@が無いものはメールアドレスではないので除いておく*/ mailAddress like '%@%'
SQL Server2019をデフォルトのままインストールを進めたところ、saでログインできなかった。
「ユーザー’sa’はログインできませんでした。(Microsoft SQL Server、エラー:18456)」エラーになる。
対処方法は以下。
以上の点を実施することにより、saでログインできるようになった。
※SQL Server 2016にて確認
-- ダミーテーブル
with dummyData as (
select 'AGroup' as code, 'A01' as child
union
select 'AGroup' , 'A02'
union
select 'AGroup' , 'A03'
union
select 'BGroup' , 'B01'
union
select 'BGroup' , 'B02'
union
select 'BGroup' , 'B03'
union
select 'CGroup' , 'C01'
)
select
code,
left(hoge.child, len(hoge.child) - 1) as child --末尾のセミコロンを除く
from
(
select distinct
dummy.code,
(
select
dummyData.child + ';' AS [text()] --セミコロン区切りしたい列を指定
from
dummyData
where
dummyData.code = dummy.code --大元のfrom句で指定されているテーブルとJOIN
for xml path ('')
) as child
from
dummyData dummy
) hoge
■実行結果
code | value |
AGroup | A01;A02;A03 |
BGroup | B01;B02;B03 |
CGroup | C01 |