Coding4Fun - 將 SSMS 產生 INSERT/UPDATE Script 轉成程式應用格式
5 |
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; }