”END_OF_SQL” は「ヒアドキュメント」を調べましょう。。
2007年10月1日 コンピュータアクセス元を見ていてたまに「END_OF_SQL」で検索してくる人がいる。。。。ってググるとこの日記が TOP に来てるやん。
ええと、「END_OF_SQL」ってなんか意味ありげな予約語に見えるかもしれないけど、違います。意味は無いです。
これは「ヒアドキュメント」という機能で、
例えば
としているのを
としても
でもいいわけである。
なお、ヒアドキュメントは「<」の数で
変数展開の規則が変わる言語があるとか、
PHP では @ は普通の文字だが
perl では @ は展開される変数の Prefix になるとか
あるので、かならず使用するもののヘルプ等を参照しましょう。
---
2009-6-12 追記・修正
SQL を記述したヒアドキュメントで変数展開することはSQLインジェクションの脆弱性につながる場合があるため、サンプルを変数展開がないものに差し替えました。
ええと、「END_OF_SQL」ってなんか意味ありげな予約語に見えるかもしれないけど、違います。意味は無いです。
これは「ヒアドキュメント」という機能で、
例えば
$SQL=<<End_Of_SQL
SELECT ’Hello’;
End_Of_SQL
としているのを
$SQL=<<End_STRING
SELECT ’Hello’;
End_STRING
としても
$SQL=<<OSHIMAIDAYO
SELECT ’Hello’;
OSHIMAIDAYO
でもいいわけである。
なお、ヒアドキュメントは「<」の数で
変数展開の規則が変わる言語があるとか、
PHP では @ は普通の文字だが
perl では @ は展開される変数の Prefix になるとか
あるので、かならず使用するもののヘルプ等を参照しましょう。
---
2009-6-12 追記・修正
SQL を記述したヒアドキュメントで変数展開することはSQLインジェクションの脆弱性につながる場合があるため、サンプルを変数展開がないものに差し替えました。
MS SQL Server の ISNULL と COALESCE の違い
2007年10月9日 コンピュータ========================
2014年2月28日追記
後述のリンク先にてここで書かれていることより
大きな違いについて言及されているので
一読を勧める。
========================
MS SQL Server に於いて
と
は同じ意味だと思っていた。
・・・しかし、上記の列a が nvarchar等文字列型だった場合は挙動が違ってくるのである。
仕事で、うっかり文字列型の列に対して「ISNULL(a,0)」と
してしまっていたところがあった(犯人は僕)。
これは「汚いが動いてしまう」コードだった。
別の人が「ISNULL より DB2 でも使える COALESCE の方がいい」
と「COALESCE(a,0)」に変えてしまった。
すると、これは「通常動かない」コードになった。
・・・気づかずにWebサイトにリリースされて発覚し、
大急ぎで正しく「COALESCE(a,’’)」修正され、再リリースとなった。
「ISNULL(a,0)」の場合、型は「第一引数の型」となる。
したがって、a が null の場合でも暗黙のキャストで文字列型で返ってくる。
「COALESCE(a,0)」の場合、型は「最も優先度の高い型」となる。
文字列型よりも 数値型の方が優先度が高いのでこの列は 数値型になる。
そして、a に 数値型にキャストできない文字列が入っていれば
その時点で SQL がエラーになる。
うぅ、ごめんなさい。。。。。orz
・・・ってもうちょっと調べた。
列a の文字列が全て数値にキャストできる場合、SQL の結果はきちんと返ってくる。
その場合、「ISNULL(a,0)」と「COALESCE(a,0)」は見かけは同じ結果が返ってくる。
しかし、「ISNULL(a,0)」は文字列型で、「COALESCE(a,0)」は数値型である。
そういうわけで、次の C# のプログラムの場合、ISNULL だと動くが COALESCE にすると実行時エラーになる。
まぁ、型には注意しましょう。あうあうあう。
===
2011年2月15日追記
SQL Server のデータ型の優先順位(SQL Server 2008)
http://msdn.microsoft.com/ja-jp/library/ms190309.aspx
=====
2014年2月28日
ISNULL と Coalesce にはもっと重大な違いがあった。
一読されることを勧める。
http://sqlmag.com/t-sql/coalesce-vs-isnull
2014年2月28日追記
後述のリンク先にてここで書かれていることより
大きな違いについて言及されているので
一読を勧める。
========================
MS SQL Server に於いて
SELECT ISNULL(a,0) FROM test1
と
SELECT COALESCE(a,0) FROM test1
は同じ意味だと思っていた。
・・・しかし、上記の列a が nvarchar等文字列型だった場合は挙動が違ってくるのである。
仕事で、うっかり文字列型の列に対して「ISNULL(a,0)」と
してしまっていたところがあった(犯人は僕)。
これは「汚いが動いてしまう」コードだった。
別の人が「ISNULL より DB2 でも使える COALESCE の方がいい」
と「COALESCE(a,0)」に変えてしまった。
すると、これは「通常動かない」コードになった。
・・・気づかずにWebサイトにリリースされて発覚し、
大急ぎで正しく「COALESCE(a,’’)」修正され、再リリースとなった。
「ISNULL(a,0)」の場合、型は「第一引数の型」となる。
したがって、a が null の場合でも暗黙のキャストで文字列型で返ってくる。
「COALESCE(a,0)」の場合、型は「最も優先度の高い型」となる。
文字列型よりも 数値型の方が優先度が高いのでこの列は 数値型になる。
そして、a に 数値型にキャストできない文字列が入っていれば
その時点で SQL がエラーになる。
うぅ、ごめんなさい。。。。。orz
・・・ってもうちょっと調べた。
列a の文字列が全て数値にキャストできる場合、SQL の結果はきちんと返ってくる。
その場合、「ISNULL(a,0)」と「COALESCE(a,0)」は見かけは同じ結果が返ってくる。
しかし、「ISNULL(a,0)」は文字列型で、「COALESCE(a,0)」は数値型である。
そういうわけで、次の C# のプログラムの場合、ISNULL だと動くが COALESCE にすると実行時エラーになる。
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Diagnostics;
namespace CoalesceTest
{
class Program
{
static void Main(string[] args)
{
DataTable dt = new DataTable("test");
//dt.Columns.Add(new DataColumn("NewA",typeof(string)));
SqlConnectionStringBuilder scb = new SqlConnectionStringBuilder();
scb.DataSource = ".";
scb.InitialCatalog = "test";
scb.IntegratedSecurity = true;
SqlConnection cnn = new SqlConnection(scb.ConnectionString);
SqlDataAdapter da = new SqlDataAdapter("SELECT ISNULL(a,0) NewA FROM test1", cnn);
//SqlDataAdapter da = new SqlDataAdapter("SELECT COALESCE(a,0) NewA FROM test1", cnn);
da.TableMappings.Add("table", "test");
da.Fill(dt);
foreach (DataRow row in dt.Rows)
{
string str = (string)row["NewA"]; <=== COALESCE だとエラー
Debug.WriteLine(str);
}
}
}
}
まぁ、型には注意しましょう。あうあうあう。
===
2011年2月15日追記
SQL Server のデータ型の優先順位(SQL Server 2008)
http://msdn.microsoft.com/ja-jp/library/ms190309.aspx
=====
2014年2月28日
ISNULL と Coalesce にはもっと重大な違いがあった。
一読されることを勧める。
http://sqlmag.com/t-sql/coalesce-vs-isnull
Advanced/W-ZERO3[es] を注文した
2007年10月12日 コンピュータ黒いのを注文した。
現在は J3002V と AH-H403C の2回線の契約をしているが、
電話番号を引き継ぐために J3002V を機種変更。
で、AH-H403C は停止する。
Advanced/W-ZERO3[es] (WS011SH) は Windows Mobile 6 なので RDP クライアントが入っている。
だから、 VPN さえ確保すればパソコンを持ち歩かなくて済むようになるのだが。。。。
現在は J3002V と AH-H403C の2回線の契約をしているが、
電話番号を引き継ぐために J3002V を機種変更。
で、AH-H403C は停止する。
Advanced/W-ZERO3[es] (WS011SH) は Windows Mobile 6 なので RDP クライアントが入っている。
だから、 VPN さえ確保すればパソコンを持ち歩かなくて済むようになるのだが。。。。
「今日の占い CountDown」のラッキーポイント
2007年10月19日 日常「今日の占い CountDown」http://www.fujitv.co.jp/meza/uranai/
の今日の山羊座のラッキーポイントは「化学雑誌」!
・・・けっこうマニアックでないか?
「科学雑誌」ならともかく。
の今日の山羊座のラッキーポイントは「化学雑誌」!
・・・けっこうマニアックでないか?
「科学雑誌」ならともかく。