MW211 EXIT

devlog
CSS3/beforeとafter
2022年11月19日
┌──────────────────────────────────────┐
│.css {                                                                      │
│    background-color  :中;                                                  │
│}                                                                           │
│.css::before {                                                              │
│    content           :"奥";                                                │
│    background-color  :奥;                                                  │
│}                                                                           │
│.css::after {                                                               │
│    content           :"手前";                                                │
│    background-color  :手前;                                                  │
│}                                                                           │
└──────────────────────────────────────┘
この場合、テキスト的には「奥 中 手前」の順に表示されるのだが
レイヤー的にも以下かと思いきや、以下なのだ
┌──────────┐┌──────────┐
│×┌───┐        ││○┌───┐        │
│  │奥┌───┐    ││  │中┌───┐    │
│  │  │中┌───┐││  │  │奥┌───┐│
│  │  │  │手前  │││  │  │  │手前  ││
└──────────┘└──────────┘

んじゃ、期待する左のようにするにはどうすればよいか?
┌──────────────────────────────────────┐
│.css::before {                                                              │
│    z-index           :-1;                                                  │
│}                                                                           │
└──────────────────────────────────────┘
「z-index」をマイナスで指定したあげればよい。(::afterでも同じ)

ただ注意点があって、本体(中)の方に「z-index」を指定してはいけない。
┌──────────────────────────────────────┐
│.css {                                                                      │
│    z-index           :2;                                                   │
│}                                                                           │
│.css::before {                                                              │
│    z-index           :-1;                                                  │
│}                                                                           │
└──────────────────────────────────────┘
こんな感じたよ奥にはいかない。

でも、本体(中)の方に「z-index」を指定したい、という時は、
「z-index」を指定する層を外側に出せばいいようだ。
┌──────────────────────────────────────┐
│.css {                                                                      │
│    z-index           :2;                                                   │
│}                                                                           │
│.css > div {                                                                │
│}                                                                           │
│.css > div::before {                                                        │
│    z-index           :-1;                                                  │
│}                                                                           │
└──────────────────────────────────────┘
HTML側はこれに伴い「<div class="css"><div></div></div>」みたいに入れ子にする。
分類:HTML5+CSS3
PHP/月末を求める書式
2022年10月11日
「t」は月数なので月末日にも使える。
┌──────────────────────────────────────┐
│echo date('Y/m/t', mktime(0, 0, 0, 10, 1, 2022));                           │
│//→2022/10/31                                                              │
├──────────────────────────────────────┤
│$newTime = new DateTime();                                                  │
│$newTime->setDate(2022, 10, 1);                                             │
│echo $newTime->format('Y/m/t');                                             │
│//→2022/10/31                                                              │
└──────────────────────────────────────┘
ということで上記のようにも使える。(なお、上記の「1」は~31ならなんでもよい)
分類:PHP
ExcelVBA/図形の削除
2022年09月27日
┌──────────────────────────────────────┐
│シート.Label除去対象.Delete                                                 │
└──────────────────────────────────────┘
図形(例えばLabel)を削除したい場合に上記のように自ら削除すると
「プロシージャの呼び出し、または引数が不正です」エラーが発生する場合
以下のように、図形をループする形で削除すれば、エラーがでないようだ。
┌──────────────────────────────────────┐
│Dim 図形 As Object                                                          │
│For Each 図形 In シート.OLEObjects                                          │
│    If 図形.Name = "Label除去対象" Then                                     │
│        図形.Delete                                                         │
│    End If                                                                  │
│Next 図形                                                                   │
└──────────────────────────────────────┘
分類:ExcelVBA
PHP/キーブレイク(グループ数)
2022年09月09日
tableタグでrowspanしたい場合、先頭行にて以降で結合する行を
あらかじめ把握しておく必要がある。

これをPHP上であらかじめ算出しておく方法。
┌──────────────────────────────────────┐
│$添字 = 0;                                                                  │
│while ($添字 < count($配列)) {                                              │
│    $old添字1 = $添字;                                                      │
│    $配列[$old添字1]['行数1'] = 0;                                          │
│    do {                                                                    │
│        $old添字2 = $添字;                                                  │
│        $配列[$old添字2]['行数2'] = 0;                                      │
│        do {                                                                │
│            $配列[$添字]['行数1'] = 0;                                      │
│            $配列[$添字]['行数2'] = 0;                                      │
│            $配列[$old添字1]['行数1']++;                                    │
│            $配列[$old添字2]['行数2']++;                                    │
│            $添字++;                                                        │
│        } while (($添字 < count($配列))                                     │
│              && ($配列[$添字]['キー1'] == $配列[$old添字1]['キー1'])       │
│              && ($配列[$添字]['キー2'] == $配列[$old添字2]['キー2']));     │
│    } while (($添字 < count($配列))                                         │
│          && ($配列[$添字]['キー1'] == $配列[$old添字1]['キー1']));         │
│}                                                                           │
└──────────────────────────────────────┘

これを元にSmartyでは以下のように出力する。
┌──────────────────────────────────────┐
│<table>                                                                     │
│{foreach from=$配列 key=no item=i}                                          │
│  <tr>                                                                      │
│{if $i['行数1'] > 0}                                                        │
│    <td rowspan="{$i['行数1']|escape}">{$i['キー1']|escape}</td>            │
│{/if}                                                                       │
│{if $i['行数2'] > 0}                                                        │
│    <td rowspan="{$i['行数2']|escape}">{$i['キー2']|escape}</td>            │
│{/if}                                                                       │
│    <td>{$i['バリュー']|escape}</td>                                        │
│  </tr>                                                                     │
│{/foreach}                                                                  │
│</table>                                                                    │
└──────────────────────────────────────┘
分類:PHP
jQueryUIダイアログ/表示位置
2022年07月15日
親領域(ここでは#main)をしてした上に、その左上(left top)から
任意の分(+16px)ずらすことができる。
┌──────────────────────────────────────┐
│$('#dialog').dialog({                                                       │
│    'position'  :{                                                          │
│        my  :'left top',                                                    │
│        at  :'left+16px top+16px',                                          │
│        of  :'#main'                                                        │
│    }                                                                       │
│});                                                                         │
└──────────────────────────────────────┘
分類:jQuery
ExcelVBA/フォルダ作成
2022年07月06日
┌──────────────────────────────────────┐
│'===========================================================================│
│'  フォルダ作成                                                             │
│'===========================================================================│
│Private Sub フォルダ作成(ByVal パス As String)                              │
│    Dim objFSO As Object                                                    │
│    Set objFSO = CreateObject("Scripting.FileSystemObject")                 │
│    '-----------------------------------------------------------------------│
│    '  既に存在するか?                                                     │
│    '-----------------------------------------------------------------------│
│''''If Dir(パス, vbDirectory) <> "" Then                                    │
│    If objFSO.FolderExists(パス) Then                                       │
│        MsgBox "そのフォルダは既に存在します"                               │
│        Exit Sub                                                            │
│    End If                                                                  │
│    '-----------------------------------------------------------------------│
│    '  親フォルダは存在するか?                                             │
│    '-----------------------------------------------------------------------│
│    Dim objREG As Object                                                    │
│    Set objREG = CreateObject("VBScript.RegExp")                            │
│    Dim 親パス As String                                                    │
│    objREG.Pattern = "\\[^\\]*$"                                            │
│    親パス = objREG.Replace(パス, "")                                       │
│''''If Dir(親パス, vbDirectory) = "" Then                                   │
│    If Not objFSO.FolderExists(親パス) Then                                 │
│        MsgBox "パスが不正です(親フォルダが見当たりません)" & vbCrLf _      │
│             & 親パス                                                       │
│        Exit Sub                                                            │
│    End If                                                                  │
│    '-----------------------------------------------------------------------│
│    '  フォルダ作成                                                         │
│    '-----------------------------------------------------------------------│
│''''MkDir パス                                                              │
│    Call objFSO.CreateFolder(パス)                                          │
│    MsgBox "終了"                                                           │
│End Sub                                                                     │
│'===========================================================================│
└──────────────────────────────────────┘
分類:ExcelVBA
VBScript/ファイルを一行ずつ読むⅡ
2022年06月10日
改行コードを認識して(LFにまるめて)ファイルを一行ずつ読む方法。
(全行を一旦配列に読み込む方式となってしまう)
UTF-8も対応(先頭のBOMで認識)。
┌──────────────────────────────────────┐
│Const adTypeBinary = 1        ' バイナリとして読込                          │
│Const adTypeText = 2          ' テキストとして読込                          │
│Const adReadAll = -1          ' 全行読込                                    │
│Const adReadLine = -2         ' 一行読込                                    │
│Const adCR = 13               ' 改行CR                                      │
│Const adCRLF = -1             ' 改行CRLF                                    │
│Const adLF = 10               ' 改行LF                                      │
│'***************************************************************************│
│'  メイン処理                                                               │
│'***************************************************************************│
│Dim objFile, theLine                                                        │
│Set objFile = New ClassFile                                                 │
│objFile.Init("ファイルパス")      ' ★ファイルパスを指定                    │
│Set theLine = objFile.Fetch()     ' 明細行一件目読込                        │
│Do While Not theLine Is Nothing                                             │
│    ' ★処理を実装                                                          │
│    Set theLine = objFile.Fetch() ' 明細行二件目以降読込                    │
│Loop                                                                        │
│Set objFile = Nothing                                                       │
│WScript.Quit(0)                                                             │
│'***************************************************************************│
│'  クラス:データベース                                                     │
│'***************************************************************************│
│Class ClassFile                                                             │
│    Private mIsOk, mLines, mIndex, mPath                                    │
│    '=======================================================================│
│    '  コンストラクタ                                                       │
│    '=======================================================================│
│    Private Sub Class_Initialize                                            │
│        mIsOk = False                                                       │
│        Set mObjStream = WScript.CreateObject("ADODB.Stream")               │
│        ' ★改行コード(以下のいずれかを指定)                                │
│        mObjStream.LineSeparator = adCR     ' 改行CR                        │
│        mObjStream.LineSeparator = adCRLF   ' 改行CRLF(既定)                │
│        mObjStream.LineSeparator = adLF     ' 改行LF                        │
│    End Sub                                                                 │
│    '=======================================================================│
│    '  準コンストラクタ                                                     │
│    '=======================================================================│
│    Public Sub Init(inPath)                                                 │
│        mPath = inPath                                                      │
│        '-------------------------------------------------------------------│
│        Dim allText                                                         │
│        Dim objStream:  Set objStream = WScript.CreateObject("ADODB.Stream")│
│        '-------------------------------------------------------------------│
│        '  文字コード識別(先頭BOMでUTF-8を)                                 │
│        '-------------------------------------------------------------------│
│        If IsExistBom(inPath) Then                                          │
│            objStream.Charset = "UTF-8"                                     │
│        Else                                                                │
│            objStream.Charset = "SHIFT_JIS"                                 │
│        End If                                                              │
│        '-------------------------------------------------------------------│
│        '  全件読込                                                         │
│        '-------------------------------------------------------------------│
│        With objStream                                                      │
│            .Type = adTypeText                                              │
│            .Open                                                           │
│            .LoadFromFile inPath                                            │
│            .Position = 0                                                   │
│            allText = .ReadText(adReadAll)                                  │
│            .Close                                                          │
│        End With                                                            │
│        '-------------------------------------------------------------------│
│        '  改行コードをLFに統一し配列化                                     │
│        '-------------------------------------------------------------------│
│        allText = Replace(allText, vbCrLf, vbLf, 1, -1, vbBinaryCompare)'CRLF→LF
│        allText = Replace(allText, vbCr, vbLf, 1, -1, vbBinaryCompare)  'CR  →LF
│        mLines = Split(allText, vbLf, -1, vbBinaryCompare)                  │
│        mIndex = 0                                                          │
│        '-------------------------------------------------------------------│
│        '  ヘッダ読込                                                       │
│        '-------------------------------------------------------------------│
│        mIsOk = True                                                        │
│        If Not ReadHeader() Then                                            │
│            mIsOk = False                                                   │
│        End If                                                              │
│    End Sub                                                                 │
│    '=======================================================================│
│    '  内部メソッド:ヘッダの読込                                           │
│    '=======================================================================│
│    Private Function ReadHeader()                                           │
│        If mIndex >= UBound(mLines) Then                                    │
│            MsgBox "空っぽです" & vbCrLf & mPath, vbCritical, "エラー"      │
│            ReadHeader = False                                              │
│            Exit Function                                                   │
│        End If                                                              │
│        Do Until mIndex >= UBound(mLines)                                   │
│            If mLines(mIndex) = "ID,…" Then  ' ★想定する見出と照合        │
│                ReadHeader = True                                           │
│                mIndex = mIndex + 1 ' 次へ                                  │
│                Exit Function                                               │
│            End If                                                          │
│            mIndex = mIndex + 1 ' 次へ                                      │
│        Loop                                                                │
│        MsgBox "これは対象ファイルではありません。" & vbCrLf _              │
│             & vbCrLf _                                                     │
│             & mPath, vbCritical, "処理スキップ"                            │
│        ReadHeader = False                                                  │
│    End Function                                                            │
│    '=======================================================================│
│    '  デストラクタ                                                         │
│    '=======================================================================│
│    Private Sub Class_Terminate                                             │
│    End Sub                                                                 │
│    '=======================================================================│
│    '  メソッド:実行                                                       │
│    '=======================================================================│
│    Public Function Fetch()                                                 │
│        If Not mIsOk Then                                                   │
│            Set Fetch = Nothing                                             │
│            Exit Function                                                   │
│        End If                                                              │
│        '-------------------------------------------------------------------│
│        ' EOF                                                               │
│        If mIndex >= UBound(mLines) Then                                    │
│            Set Fetch = Nothing                                             │
│            Exit Function                                                   │
│        End If                                                              │
│        '-------------------------------------------------------------------│
│        Set Fetch = mLines(mIndex)                                          │
│        mIndex = mIndex + 1 ' 次へ                                          │
│    End Function                                                            │
│    '=======================================================================│
│    '  内部メソッド:BOMの存在チェック                                      │
│    '=======================================================================│
│    Private Function IsExistBom(inPath)                                     │
│        Dim objStream:  Set objStream = WScript.CreateObject("ADODB.Stream")│
│        Dim bin, data                                                       │
│        bin = vbNullString                                                  │
│        With objStream                                                      │
│            .Type = adTypeBinary                                            │
│            .Open                                                           │
│            .LoadFromFile inPath                                            │
│            .Position = 0                                                   │
│            If .Size >= 3 Then                                              │
│                data = .Read(3)                                             │
│                bin = Hex(AscB(MidB(data, 1, 1))) _                         │
│                    & Hex(AscB(MidB(data, 2, 1))) _                         │
│                    & Hex(AscB(MidB(data, 3, 1)))                           │
│            End If                                                          │
│            .Close                                                          │
│        End With                                                            │
│        IsExistBom = (bin = "EFBBBF")                                       │
│    End Function                                                            │
│    '=======================================================================│
│End Class                                                                   │
└──────────────────────────────────────┘
分類:WSH・VBS
VBScript/ファイルを一行ずつ読む
2022年06月09日
改行コードを指定してファイルを一行ずつ読む方法。
UTF-8も対応(先頭のBOMで認識)。
┌──────────────────────────────────────┐
│Const adTypeBinary = 1        ' バイナリとして読込                          │
│Const adTypeText = 2          ' テキストとして読込                          │
│Const adReadAll = -1          ' 全行読込                                    │
│Const adReadLine = -2         ' 一行読込                                    │
│Const adCR = 13               ' 改行CR                                      │
│Const adCRLF = -1             ' 改行CRLF                                    │
│Const adLF = 10               ' 改行LF                                      │
│'***************************************************************************│
│'  メイン処理                                                               │
│'***************************************************************************│
│Dim objFile, theLine                                                        │
│Set objFile = New ClassFile                                                 │
│objFile.Init("ファイルパス")      ' ★ファイルパスを指定                    │
│Set theLine = objFile.Fetch()     ' 明細行一件目読込                        │
│Do While Not theLine Is Nothing                                             │
│    ' ★処理を実装                                                          │
│    Set theLine = objFile.Fetch() ' 明細行二件目以降読込                    │
│Loop                                                                        │
│Set objFile = Nothing                                                       │
│WScript.Quit(0)                                                             │
│'***************************************************************************│
│'  クラス:データベース                                                     │
│'***************************************************************************│
│Class ClassFile                                                             │
│    Private mIsOk, mObjStream, mPath                                        │
│    '=======================================================================│
│    '  コンストラクタ                                                       │
│    '=======================================================================│
│    Private Sub Class_Initialize                                            │
│        mIsOk = False                                                       │
│        Set mObjStream = WScript.CreateObject("ADODB.Stream")               │
│        ' ★改行コード(以下のいずれかを指定)                                │
│        mObjStream.LineSeparator = adCR     ' 改行CR                        │
│        mObjStream.LineSeparator = adCRLF   ' 改行CRLF(既定)                │
│        mObjStream.LineSeparator = adLF     ' 改行LF                        │
│    End Sub                                                                 │
│    '=======================================================================│
│    '  準コンストラクタ                                                     │
│    '=======================================================================│
│    Public Sub Init(inPath)                                                 │
│        mPath = inPath                                                      │
│        If IsExistBom(inPath) Then                                          │
│            mObjStream.Charset = "UTF-8"                                    │
│        Else                                                                │
│            mObjStream.Charset = "SHIFT_JIS"                                │
│        End If                                                              │
│        With mObjStream                                                     │
│            .Type = adTypeText                                              │
│            .Open                                                           │
│            .LoadFromFile inPath                                            │
│            .Position = 0                                                   │
│        End With                                                            │
│        '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -│
│        mIsOk = True                                                        │
│        If Not ReadHeader() Then                                            │
│            mIsOk = False                                                   │
│        End If                                                              │
│    End Sub                                                                 │
│    '=======================================================================│
│    '  内部メソッド:ヘッダの読込                                           │
│    '=======================================================================│
│    Private Function ReadHeader()                                           │
│        If mObjStream.EOS Then                                              │
│            MsgBox "空っぽです" & vbCrLf & mPath, vbCritical, "エラー"      │
│            ReadHeader = False                                              │
│            Exit Function                                                   │
│        End If                                                              │
│        Dim theLine                                                         │
│        theLine = mObjStream.ReadText(adReadLine)                           │
│        Do Until mObjStream.EOS                                             │
│            If theLine = "ID,…" Then  ' ★想定する見出と照合               │
│                ReadHeader = True                                           │
│                Exit Function                                               │
│            End If                                                          │
│            theLine = mObjStream.ReadText(adReadLine)                       │
│        Loop                                                                │
│        MsgBox "これは対象ファイルではありません。" & vbCrLf _              │
│             & vbCrLf _                                                     │
│             & mPath, vbCritical, "処理スキップ"                            │
│        ReadHeader = False                                                  │
│    End Function                                                            │
│    '=======================================================================│
│    '  デストラクタ                                                         │
│    '=======================================================================│
│    Private Sub Class_Terminate                                             │
│        mObjStream.Close                                                    │
│    End Sub                                                                 │
│    '=======================================================================│
│    '  メソッド:実行                                                       │
│    '=======================================================================│
│    Public Function Fetch()                                                 │
│        If Not mIsOk Then                                                   │
│            Set Fetch = Nothing                                             │
│            Exit Function                                                   │
│        End If                                                              │
│        '-------------------------------------------------------------------│
│        ' EOF                                                               │
│        If mObjStream.EOS Then                                              │
│            Set Fetch = Nothing                                             │
│            Exit Function                                                   │
│        End If                                                              │
│        '-------------------------------------------------------------------│
│        Set Fetch = mObjStream.ReadText(adReadLine)                         │
│    End Function                                                            │
│    '=======================================================================│
│    '  内部メソッド:BOMの存在チェック                                      │
│    '=======================================================================│
│    Private Function IsExistBom(inPath)                                     │
│        Dim objStream:  Set objStream = WScript.CreateObject("ADODB.Stream")│
│        Dim bin, data                                                       │
│        bin = vbNullString                                                  │
│        With objStream                                                      │
│            .Type = adTypeBinary                                            │
│            .Open                                                           │
│            .LoadFromFile inPath                                            │
│            .Position = 0                                                   │
│            If .Size >= 3 Then                                              │
│                data = .Read(3)                                             │
│                bin = Hex(AscB(MidB(data, 1, 1))) _                         │
│                    & Hex(AscB(MidB(data, 2, 1))) _                         │
│                    & Hex(AscB(MidB(data, 3, 1)))                           │
│            End If                                                          │
│            .Close                                                          │
│        End With                                                            │
│        IsExistBom = (bin = "EFBBBF")                                       │
│    End Function                                                            │
│    '=======================================================================│
│End Class                                                                   │
└──────────────────────────────────────┘
分類:WSH・VBS
MSSQL/FOR XML PATHを復習
2022年05月28日
複数行を横一列にする方法として、MSSQLでは「FOR XML PATH」を用いる。
その意味をもう一度復習

「FOR XML PATH」をつけると、XML形式として横一列に表示ができる。
┌──────────────────────────────────────┐
│WITH [表] AS (                                                              │
│         SELECT * FROM (VALUES ('A'),                                       │
│                               ('B'),                                       │
│                               ('C')) AS [表]([列])                         │
│     )                                                                      │
│SELECT [列]                                                                 │
│    FROM [表]                                                               │
│    FOR XML PATH ('');                                                      │
│--→「<列>A</列><列>B</列><列>C</列>」                                      │
└──────────────────────────────────────┘
通常は列名でタグが付いてくる。

これを、列名[data()]にすると、スペース区切りにすることができる
┌──────────────────────────────────────┐
│WITH [表] AS (                                                              │
│         SELECT * FROM (VALUES ('A'),                                       │
│                               ('B'),                                       │
│                               ('C')) AS [表]([列])                         │
│     )                                                                      │
│SELECT [列] AS [data()]                                                     │
│    FROM [表]                                                               │
│    FOR XML PATH ('');                                                      │
│--→「A B C」                                                               │
└──────────────────────────────────────┘
内側だけにスペースが付くので便利。
このスペースを区切り文字に置換すればよいわけだ。

では列名をなくしてしまえばどうだろう。
どのようなやり方でもよいがAS句で列名を指定しなければないけない形にもっていく。
(以下の場合は人畜無害な空文字を付加する形をとってみた)
┌──────────────────────────────────────┐
│WITH [表] AS (                                                              │
│         SELECT * FROM (VALUES ('A'),                                       │
│                               ('B'),                                       │
│                               ('C')) AS [表]([列])                         │
│     )                                                                      │
│SELECT [列] + ''                                                            │
│    FROM [表]                                                               │
│    FOR XML PATH ('');                                                      │
│--→「ABC」                                                                 │
└──────────────────────────────────────┘
これで列名によるタグがなくなるが、今度は区切りがまったくなくなってしまう。

ということで、自前で区切り文字をあらかじめつけたのが以下。
┌──────────────────────────────────────┐
│WITH [表] AS (                                                              │
│         SELECT * FROM (VALUES ('A'),                                       │
│                               ('B'),                                       │
│                               ('C')) AS [表]([列])                         │
│     )                                                                      │
│SELECT [列] + ','                                                           │
│    FROM [表]                                                               │
│    FOR XML PATH ('');                                                      │
│--→「A,B,C,」                                                              │
└──────────────────────────────────────┘
好きな区切り文字を指定できるが、外側にもついてしまうのが難点。


ちなみに「',' + [列]」と逆にすると、「,A,B,C」になる。
┌──────────────────────────────────────┐
│WITH [表] AS (                                                              │
│         SELECT * FROM (VALUES ('A'),                                       │
│                               ('B'),                                       │
│                               ('C')) AS [表]([列])                         │
│     )                                                                      │
│SELECT STUFF((SELECT ',' + [列]                                             │
│                  FROM [表]                                                 │
│                  FOR XML PATH ('')), 1, 1, '');                            │
│--→「A,B,C」                                                               │
└──────────────────────────────────────┘
そこでSTUFF関数と組み合わせればなんとなくいけるかも。

列名[data()]のやり方だとデータ中に半角スペースが混じっていると
破綻してしまうのだが、以下のような感じで
使われないであろう文字を区切り文字にして回避することができてしまう。
┌──────────────────────────────────────┐
│WITH [表] AS (                                                              │
│         SELECT * FROM (VALUES ('A X'),                                     │
│                               ('B Y'),                                     │
│                               ('C Z')) AS [表]([列])                       │
│     )                                                                      │
│SELECT REPLACE(STUFF((SELECT '\n' + [列]                                    │
│                          FROM [表]                                         │
│                          FOR XML PATH ('')), 1, 2, ''), '\n', CHAR(10));   │
│--→「A X                                                                   │
│      B Y                                                                   │
│      C Z」                                                                 │
└──────────────────────────────────────┘
分類:MSSQL
MSSQL/JOINによるUPDATEで複数候補
2022年05月27日
他テーブルをJOINしてUPDATEする場合、複数行になったらどうなるのか?
┌──────────────────────────────────────┐
│GO                                                                          │
│    DECLARE @テストD table (                                               │
│        [列]    [nvarchar](16)  NULL                                        │
│    );                                                                      │
│    INSERT INTO @テストD VALUES (NULL);                                    │
│    UPDATE [出力D]                                                         │
│        SET [列] = [入力D].[列]                                            │
│        FROM @テストD AS [出力D]                                          │
│            CROSS JOIN (                                                    │
│                SELECT *                                                    │
│                    FROM (                                                  │
│                        VALUES ('A'),                                       │
│                               ('B'),                                       │
│                               ('C')                                        │
│                    ) AS [入力D]([列])                                     │
│            ) AS [入力D];                                                  │
│    SELECT * FROM @テストD;                                                │
│GO                                                                          │
│--→「A」に更新された                                                       │
└──────────────────────────────────────┘
最初のレコードが優先される。

でも、最初ってなんだよ?問題が発生する恐れがあるので、
あまり使わない方がよいだろう。
ひとまず二重キーエラーとかにならないので、対策は軽くてよいということで。
分類:MSSQL
前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 … 156 次へ