2023年9月22日 星期五

如何在 docker 安裝 SQLServer 2022 的容器

如何在 docker 安裝 SQLServer 2022 的容器

現代在Windwos11上安裝相比於之前簡單了不少,現在一步一步跟著安裝吧。

裝在 docker 上有一個好處是不會掛在服務上要關掉直接關掉 docker 就好一切乾淨,軟體層面切割的比較徹底一些。

另外因為是 docker 是跑在 linux 上的,所以間接的 Mac M2 晶片的電腦也受益了是可以安裝的。



步驟1. WSL2

安裝 WSL2 指令參考這個

wsl --install

以前還要定系統設定現在通通不用了,直接就整合好一個指令裝到好
裝好之後需要重新啟動,重新動之後會看開裡面多出幾個東西

找到多出來的 ubuntu 打開它還會在安裝一次,裝好就能用了,過程會提示要輸入帳號密碼

一切都好了之後,用這個指令做最後的確認可以看安裝的是幾版的

wsl --list --verbose


有一點讓我有點意外的在 Windwos11 上這樣裝完顯示的版本居然是 WSL2 但卻沒有啟用 Hyper-V ,不知道是不是改版了 WSL2 沒有綁定 Hyper-V 還是怎樣。

雖然不知道為什麼,總之有這個疑慮的人照著這篇做完可以放心沒有被強制開啟 Hyper-V ,下面安裝 docker 也要注意要用 WSL 的環境,不然安裝檔會順便幫你啟用。



步驟2. 安裝docker

Docker: Accelerated Container Application Development
首頁就一個大大的下載,載了直接裝就是了

過程中會問你要不要用wsl的環境,全都預設給他按下去就好了
裝好打開看一兩眼沒問題就可以裝 SQLServer 了



步驟3. 安裝 SQLServer

指令只有兩個

下載容器

docker pull mcr.microsoft.com/mssql/server:2022-latest

載好之後再來要啟動它,這個啟動可以當作是實例要啟幾個都行每個獨立的
這邊密碼自己改一個包含<括號>整團是密碼,別留下括號會變成密碼的一部分
sql1就當作實例的區別吧如果要啟第二個實例這邊要改

docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<Your@Passw0rd>" `
   -p 1433:1433 --name sql1 --hostname sql1 `
   -d mcr.microsoft.com/mssql/server:2022-latest

然後就完成了,再來隨意載個能連的軟體連接看看,預設管理員是SA

推薦載這個輕巧好看的軟體:Download and install Azure Data Studio




參考



SQLServer 在資料庫中反向查詢字串值在哪個表裡

SQLServer 在資料庫中反向查詢字串值在哪個表裡

算是反向查詢吧,不知道表在那裏只知道數值,又正好這個數值足夠特別不是到處都有的,可以反向特定出位於哪個表格裡。


直接上代碼


-- 宣告搜尋的字串和結果表格
DECLARE @TargetString nvarchar(255) = '<要檢索的字串>';
DECLARE @SearchResults TABLE (
    TableType nvarchar(10),
    FullTableName nvarchar(500),
    ColumnName nvarchar(370),
    ColumnValue nvarchar(3630)
);

-- 宣告用於循環處理的變數
DECLARE 
    @CurrentTable nvarchar(256),
    @CurrentColumn nvarchar(128),
    @QueryString nvarchar(110),
    @CurrentTableType nvarchar(10),
    @DatabaseName nvarchar(128)

-- 初始設定
SET @CurrentTable = ''
SET @QueryString = QUOTENAME('%' + @TargetString + '%','''')
SET @DatabaseName = QUOTENAME(DB_NAME())

-- 在資料庫中迭代所有的表格和視圖
WHILE @CurrentTable IS NOT NULL
BEGIN
    SET @CurrentColumn = ''

    -- 獲取下一個表格或視圖名稱
    SET @CurrentTable =
    (
        SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
        FROM INFORMATION_SCHEMA.TABLES
        WHERE (TABLE_TYPE = 'BASE TABLE' OR TABLE_TYPE = 'VIEW')
            AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @CurrentTable
            AND OBJECTPROPERTY(OBJECT_ID(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)), 'IsMSShipped') = 0
    )

    -- 確定當前的表格/視圖類型
    SELECT @CurrentTableType = TABLE_TYPE
    FROM INFORMATION_SCHEMA.TABLES
    WHERE QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) = @CurrentTable

    -- 打印當前搜尋的表格或視圖名稱
    PRINT 'Searching ' + @DatabaseName + '.' + @CurrentTable + ' (Type: ' + @CurrentTableType + ')';

    -- 迭代當前表格/視圖的所有列
    WHILE (@CurrentTable IS NOT NULL) AND (@CurrentColumn IS NOT NULL)
    BEGIN
        -- 獲取下一個列名稱
        SET @CurrentColumn =
        (
            SELECT MIN(QUOTENAME(COLUMN_NAME))
            FROM INFORMATION_SCHEMA.COLUMNS
            WHERE TABLE_SCHEMA = PARSENAME(@CurrentTable, 2)
                AND TABLE_NAME  = PARSENAME(@CurrentTable, 1)
                AND QUOTENAME(COLUMN_NAME) > @CurrentColumn
        )

        -- 如果該列存在,則搜尋目標字串
        IF @CurrentColumn IS NOT NULL
        BEGIN
            BEGIN TRY
                SET NOCOUNT ON;
                INSERT INTO @SearchResults
                EXEC
                (
                    'SELECT ''' + @CurrentTableType + ''', ' + 
                        '''' + @DatabaseName + '.' + @CurrentTable + ''', ' + 
                        '''' + @CurrentColumn + ''', ' + 
                        'LEFT(CONVERT(nvarchar(3630), ' + @CurrentColumn + '), 3630) ' + 
                    'FROM ' + @CurrentTable + ' (NOLOCK) ' + 
                    'WHERE ' + @CurrentColumn + ' IS NOT NULL' + 
                        ' AND CONVERT(nvarchar(3630), ' + @CurrentColumn + ') LIKE ' + @QueryString
                )
                SET NOCOUNT OFF;
            END TRY
            BEGIN CATCH
                PRINT '  Warning: Skipped searching ' + @DatabaseName + '.' + @CurrentTable + ' (Type: ' + @CurrentTableType + ') perhaps due to potential locking issues.';
                PRINT '    Message: ' + ERROR_MESSAGE();
                BREAK;
            END CATCH
        END
    END 
END

-- 返回搜尋結果
SELECT TableType, FullTableName, ColumnName, ColumnValue FROM @SearchResults



第二版本

  1. 新增簡單的邏輯判斷(表格或VIEW無效不掃描)避開不必要警告
  2. 新增簡單進度表 [目前/總共] 的輸出
  3. 防鎖表由 NOLOCK 改成全域的交易等級 READ UNCOMMITTED


-- 宣告搜尋的字串和結果表格
DECLARE @TargetString nvarchar(255) = '<要檢索的字串>';
DECLARE @SearchResults TABLE (
  TableType nvarchar(10),
  FullTableName nvarchar(500),
  ColumnName nvarchar(370),
  ColumnValue nvarchar(3630)
);

-- 設定交易隔離等級為 READ UNCOMMITTED
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

-- 宣告用於循環處理的變數
DECLARE 
  @CurrentTable nvarchar(256),
  @CurrentColumn nvarchar(128),
  @QueryString nvarchar(110),
  @CurrentTableType nvarchar(10),
  @DatabaseName nvarchar(128),
  @TotalTables int,
  @CurrentTableNumber int

-- 初始設定
SET @CurrentTable = ''
SET @QueryString = QUOTENAME('%' + @TargetString + '%','''')
SET @DatabaseName = QUOTENAME(DB_NAME())
SET @CurrentTableNumber = 0

-- 計算總表格數
SELECT @TotalTables = COUNT(*)
FROM INFORMATION_SCHEMA.TABLES
WHERE (TABLE_TYPE = 'BASE TABLE' OR TABLE_TYPE = 'VIEW')
  AND OBJECTPROPERTY(OBJECT_ID(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)), 'IsMSShipped') = 0

-- 在資料庫中迭代所有的表格和視圖
WHILE @CurrentTable IS NOT NULL
BEGIN
  SET @CurrentColumn = ''

  -- 獲取下一個表格或視圖名稱
  SET @CurrentTable =
  (
    SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
    FROM INFORMATION_SCHEMA.TABLES
    WHERE (TABLE_TYPE = 'BASE TABLE' OR TABLE_TYPE = 'VIEW')
      AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @CurrentTable
      AND OBJECTPROPERTY(OBJECT_ID(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)), 'IsMSShipped') = 0
  )

  SET @CurrentTableNumber = @CurrentTableNumber + 1

  -- 檢查表格或視圖是否存在
  IF @CurrentTable IS NOT NULL AND NOT EXISTS (
    SELECT 1 
    FROM sys.objects 
    WHERE object_id = OBJECT_ID(@CurrentTable)
      AND (type = 'U' OR type = 'V')
  )
  BEGIN
    PRINT 'Skipping ' + @DatabaseName + '.' + @CurrentTable + ' [' + CAST(@CurrentTableNumber AS varchar) + '/' + CAST(@TotalTables AS varchar) + '] - object no longer exists';
    CONTINUE
  END

  -- 確定當前的表格/視圖類型
  SELECT @CurrentTableType = TABLE_TYPE
  FROM INFORMATION_SCHEMA.TABLES
  WHERE QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) = @CurrentTable

  -- 打印當前搜尋的表格或視圖名稱
  PRINT 'Searching ' + @DatabaseName + '.' + @CurrentTable + ' [' + CAST(@CurrentTableNumber AS varchar) + '/' + CAST(@TotalTables AS varchar) + '] (Type: ' + @CurrentTableType + ')';

  -- 迭代當前表格/視圖的所有列
  WHILE (@CurrentTable IS NOT NULL) AND (@CurrentColumn IS NOT NULL)
  BEGIN
    -- 獲取下一個列名稱
    SET @CurrentColumn =
    (
      SELECT MIN(QUOTENAME(COLUMN_NAME))
      FROM INFORMATION_SCHEMA.COLUMNS
      WHERE TABLE_SCHEMA = PARSENAME(@CurrentTable, 2)
        AND TABLE_NAME  = PARSENAME(@CurrentTable, 1)
        AND QUOTENAME(COLUMN_NAME) > @CurrentColumn
    )

    -- 如果該列存在,則搜尋目標字串
    IF @CurrentColumn IS NOT NULL
    BEGIN
      BEGIN TRY
        SET NOCOUNT ON;
        INSERT INTO @SearchResults
        EXEC
        (
          'SELECT ''' + @CurrentTableType + ''', ' + 
            '''' + @DatabaseName + '.' + @CurrentTable + ''', ' + 
            '''' + @CurrentColumn + ''', ' + 
            'LEFT(CONVERT(nvarchar(3630), ' + @CurrentColumn + '), 3630) ' + 
          'FROM ' + @CurrentTable + ' ' + 
          'WHERE ' + @CurrentColumn + ' IS NOT NULL' + 
            ' AND CONVERT(nvarchar(3630), ' + @CurrentColumn + ') LIKE ' + @QueryString
        )
        SET NOCOUNT OFF;
      END TRY
      BEGIN CATCH
        PRINT '  Warning: Skipped searching ' + @DatabaseName + '.' + @CurrentTable + ' (Type: ' + @CurrentTableType + ') perhaps due to potential locking issues.';
        PRINT '    Message: ' + ERROR_MESSAGE();
        BREAK;
      END CATCH
    END
  END 
END

-- 返回搜尋結果
SELECT TableType, FullTableName, ColumnName, ColumnValue FROM @SearchResults


2023年9月18日 星期一

刪除右鍵 "在Visual Studio中打開" 的選單

刪除右鍵 “在Visual Studio中打開” 的選單

對於希望右鍵選單簡潔強迫症的人來說,多這些用不到的選單真的很煩



停用右鍵選單

直接上命令快速停用

reg add "HKEY_CLASSES_ROOT\Directory\Background\shell\AnyCode" /v "LegacyDisable" /t REG_SZ /f
reg add "HKEY_CLASSES_ROOT\Directory\shell\AnyCode" /v "LegacyDisable" /t REG_SZ /f

執行完畢再回到桌面點右鍵該選單就會消失了



復原變更

由於沒有直接刪除原本的值,要復原的話刪除 LegacyDisable 這個項目即可

reg delete "HKEY_CLASSES_ROOT\Directory\Background\shell\AnyCode" /v "LegacyDisable" /f
reg delete "HKEY_CLASSES_ROOT\Directory\shell\AnyCode" /v "LegacyDisable" /f

就此就能輕易復原了



2023年9月13日 星期三

[Win10/Win11] 移除右鍵菜單中 "使用skype共享" 選項

[Win10/Win11] 移除右鍵菜單中 “使用skype共享” 選項



右鍵的選項不知道己版開始偷偷加了這東西,看了很礙眼這邊提供幾個方法消除。


從命令列輸入這行可以快速消除

reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\PackagedCom\Package\Microsoft.SkypeApp_15.103.3208.0_x64__kzf8qxf38zg5c\Class\{776DBC8D-7347-478C-8D71-791E12EF49D8}" /v "DllPath" /t REG_SZ /d "-Skype\SkypeContext.dll" /f


復原的話把 -Skype\SkypeContext.dll 中的負號移除即可,這邊僅添加負號盡可能保持原本的數據沒刪除了,可以很容易復原。




登陸檔位置在這裡

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\PackagedCom\Package\Microsoft.SkypeApp_15.103.3208.0_x64__kzf8qxf38zg5c\Class\{776DBC8D-7347-478C-8D71-791E12EF49D8}







2023年9月10日 星期日

PowerShell 爬蟲自動化安裝 Maven 最新版本

PowerShell 爬蟲自動化安裝 Maven 最新版本

為了方便安裝,寫一個自動爬 Maven 官方最新版的爬蟲,再搭配自動化執行後續安裝的批次檔,可以實現全自動安裝。

主要是寫一個基礎版本,往後有什麼要自動化的參考這個版本就能快速修改了。
https://gist.github.com/hunandy14/0f3377e468ac85a589818295e3c3c27e


快速使用

irm bit.ly/3RdEkBK|iex; Install-Maven "C:\app"




在 Vscode 中使用 Java Maven 範例

在 Vscode 中使用 Java Maven 範例

Maven 可以用來建構和管理專案,包含對於庫的管理可以自動從支援的清單內自動下載,算是非常方便的省去不少建構上的麻煩。

這邊為了快速測試搭配 Vscode 做範例說明。




安裝 Maven

官方下載頁面:https://maven.apache.org/download.cgi
下載第二行的 Binary zip archive 這是我們要的檔案


載完之後找個合適的地方解壓縮,這邊用 C:\app 當範例,當前版本是 3.9.4 解出來後需要加到環境變數的位置會在

C:\app\apache-maven-3.9.4\bin


這邊用 PowerShell 加入環境變數 (需要使用管理員模式開啟)

[Environment]::SetEnvironmentVariable("PATH", "$($env:Path);C:\app\apache-maven-3.9.4\bin;", "Machine")


加完之後就能用了,用這個指令測試能不能用

mvn -v

如上圖那樣就是正確安裝好了


如果出現找不到 JAVA_HOME 的話表示電腦沒安裝 JAVA,這邊懶人包補裝一下就好
https://www.oracle.com/java/technologies/downloads/#jdk20-windows





從 vscode 執行 java 範例程式

先從套件區下載 Maven for Java 安裝



然後建立一個空資料 Demo 用 vscode 開啟


vscode 中按下 Ctrl+Shift+P 叫出命令列安裝
輸入 Maven後選擇 建立 Maven 專案



選擇快速建立



選擇1.4



網址預設狀態直接 Enter 即可



專案名稱預設 Demo 即可



選擇建立的位置,因為剛剛已經先建立好了直接Enter就好



選取資料夾之後注意看底下有對話要回復,版本輸入1.0按 Enter



然後會讓你確認是否正確,輸入Y之後就會自動建立好範例專案了



再來就建立好了



按下F5可以看到程式跑的結果



到此範例程式就生成完畢並成功執行了




添加 Lib 庫

套件查詢網頁: https://mvnrepository.com/


Maven的Lib庫管理是寫在 pom.xml 這個裡面裡面的,打開之後可以看到預設他有一個 junit 要追加的話,就在這個區塊前後添加即可



這邊舉個例子添加 sqlserver 的套件,需要的代碼可以從網站中查到,其中我選擇 12.4.0.jre8



版本點進來就有 Maven 用的代碼了



貼到剛剛 juint 附近,存檔之後右下角選是 Yes,按了會自動檢查有沒有貼錯




正確無誤之後再來在底下終端機輸 cd demo 進入 pom.xml 所在位置,然後再輸入 mvn clean install 清除已經編譯的檔案然後再重新編譯(會順便下載缺失的lib套件)



就此就完成了下載lib庫了,可以直接在代碼使用該庫的函式了