SSMS 有個好用功能,在資料表按右鍵能自動產生 INSERT/UPDATE 用的 SQL 指令範例:

不過呢,轉換結果原本是提供在 SSMS 中修改後執行,有點過度貼心跟囉嗦:

INSERT INTO [HumanResources].[Employee]
           ([BusinessEntityID]
           ,[NationalIDNumber]
           ,[LoginID]
           ,[OrganizationNode]
           ,[JobTitle]
           ,[BirthDate]
           ,[MaritalStatus]
           ,[Gender]
           ,[HireDate]
           ,[SalariedFlag]
           ,[VacationHours]
           ,[SickLeaveHours]
           ,[CurrentFlag]
           ,[rowguid]
           ,[ModifiedDate])
     VALUES
           (<BusinessEntityID, int,>
           ,<NationalIDNumber, nvarchar(15),>
           ,<LoginID, nvarchar(256),>
           ,<OrganizationNode, hierarchyid,>
           ,<JobTitle, nvarchar(50),>
           ,<BirthDate, date,>
           ,<MaritalStatus, nchar(1),>
           ,<Gender, nchar(1),>
           ,<HireDate, date,>
           ,<SalariedFlag, [dbo].[Flag],>
           ,<VacationHours, smallint,>
           ,<SickLeaveHours, smallint,>
           ,<CurrentFlag, [dbo].[Flag],>
           ,<rowguid, uniqueidentifier,>
           ,<ModifiedDate, datetime,>)

資料表、欄位名稱都有加上 [ ] 防止名稱含空白字元被曲解(實務上很少人命名硬加空白自找麻煩吧?),VALUES 部分用欄位名稱加逗號附上型別,讓你知道要給數字、字串還是日期。

我有時會用它產生 SqlCommand 或 Dapper 要用的指令,此時就需要一些加工:移掉 [ ] 及換行讓指令精簡一點,將 VALUES 部分換成 @BusinessEntityID, @NationalIDNumber... 的參數列表形式,整理成類以以下結果:

INSERT INTO HumanResources.Employee
           (BusinessEntityID, NationalIDNumber, LoginID, OrganizationNode, JobTitle, BirthDate, MaritalStatus, Gender, HireDate, SalariedFlag, VacationHours, SickLeaveHours, CurrentFlag, rowguid, ModifiedDate)
     VALUES
           (@BusinessEntityID, @NationalIDNumber, @LoginID, @OrganizationNode, @JobTitle, @BirthDate, @MaritalStatus, @Gender, @HireDate, @SalariedFlag, @VacationHours, @SickLeaveHours, @CurrentFlag, @rowguid, @ModifiedDate)

做這種沒營養的手工實在沒意義,那就寫幾行程式自動化吧!

我計劃做成網頁放在線上方便使用,而程式碼超級簡單,在 textarea 貼上 SSMS 產生的 INSERT/UPDATE 指令,按鈕後取值經過三次 RegExp 轉換,順利達成目的:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>SSMS SQL Script Transformer</title>
  <style>
    textarea,button { display: block; margin-bottom: 3px; }
    textarea { width: 640px; height: 480px; }
  </style>
</head>
<body>
  <button onclick="convert()">Convert</button>
  <textarea id=raw></textarea>
  <pre id=res>
  </pre>
  <script>
    function convert() {
      const result = 
            raw.value.replace(/\[([^\]]+)\]/g, '$1')
              .replace(/<([^,]+),[^>]+>/g, '@$1')
              .replace(/\n\s+,/g, ', ');
      res.textContent = result;
    }
  </script>

</body>
</html>

線上展示

寫程式提升工作效率再 +1。

Little example to convert INSERT/UPDATE scripts generated by SSMS to the format for ADO.NET.


Comments

# by Jack Chiang

您可以試試看 若DBName如下 test-123 實務上這樣會死,TableName我實務上沒試過,但我覺得應該也會死

# by GregYu

個人淺見, 保留 [中括號] 並無壞處, 也避免額外的 Bug, 誰知道甚麼時候會有菜鳥搞飛機

# by ehaaaaaaaaa

直接利用https://output.jsbin.com/meyepas效率再 +2。跪求网址不要下线

# by Jack

https://github.com/illesarnold/DTE 這工具不錯,有點小BUG抓回來改改就好了。

# by Vincent

全套服務: function convert() { var result = raw.value.replace(/\[([^\]]+)\]/g, '$1') .replace(/<([^,]+),[^>]+>/g, '@$1') .replace(/\n\s+,/g, ', '); var cmd2value = result.match(/@([^,]*)/g); var AddWithValue=""; cmd2value.forEach(function (item) { AddWithValue += "cmd.Parameters.AddWithValue(\""+item+"\", Server.HtmlEncode("+item+"));\n"; }); var command = "\n\nSqlCommand cmd = new SqlCommand(sql, conn)\n\n"; res.textContent = "sql = " + result + command + AddWithValue; }

Post a comment