Skip to content

Commit 92a8527

Browse files
authored
Merge pull request #25 from SQLPlayer/develop
ver.2.4
2 parents d6dbf17 + e506676 commit 92a8527

File tree

7 files changed

+240
-185
lines changed

7 files changed

+240
-185
lines changed

App.config

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<configuration>
3+
<appSettings>
4+
<add key="excludeDataTypes" value="timestamp;" />
5+
</appSettings>
36
<startup>
47
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2"/>
58
</startup>

ChangesLog.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
11
SQLPlayer Data Script Writer - Changes Log
22
==========================================
33

4+
ver.2.4 @ 08/09/2021
5+
- Support for datetimeoffset type (#20)
6+
- Config data types to not be scripted (#20)
7+
- Fixed SQL reading structure of a table (#23)
8+
- Do not script calculated columns (#18)
9+
- Option to open target folder in Explorer
10+
411
ver.2.3 @ 02/12/2020
512
- Support for Temporal tables (#10)
613
- Support for Time data type (#14)

DataScriptWriter.csproj

Lines changed: 172 additions & 171 deletions
Large diffs are not rendered by default.

Properties/Resources.Designer.cs

Lines changed: 5 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Properties/Resources.resx

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,8 @@ INNER JOIN sys.schemas s on s.schema_id = o.schema_id
153153
WHERE o.name = parsename(@TableName, 1) and s.name = parsename(@TableName, 2)
154154
);
155155
WITH cc as (
156-
SELECT c.name as COLUMN_NAME, c.is_identity from sys.objects o
156+
SELECT c.name as COLUMN_NAME, c.is_identity, c.is_computed
157+
FROM sys.objects o
157158
INNER JOIN sys.columns c ON c.object_id = o.object_id
158159
WHERE o.object_id = @oid
159160
)
@@ -163,6 +164,7 @@ LEFT JOIN (
163164
select tc.TABLE_SCHEMA, tc.TABLE_NAME, kcu.COLUMN_NAME, tc.constraint_type
164165
from information_schema.table_constraints tc
165166
join information_schema.key_column_usage kcu on
167+
tc.table_schema = kcu.table_schema and
166168
tc.table_name = kcu.table_name and
167169
tc.constraint_name = kcu.constraint_name
168170
where tc.table_name = parsename(@TableName, 1) and
@@ -171,7 +173,8 @@ LEFT JOIN (
171173
) as co on co.TABLE_SCHEMA = c.TABLE_SCHEMA and co.TABLE_NAME = c.TABLE_NAME and co.COLUMN_NAME = c.COLUMN_NAME
172174
LEFT JOIN cc ON cc.COLUMN_NAME = c.COLUMN_NAME
173175
where c.table_name = parsename(@TableName, 1) and
174-
c.table_schema = parsename(@TableName, 2) ;</value>
176+
c.table_schema = parsename(@TableName, 2)
177+
and cc.is_computed = 0</value>
175178
</data>
176179
<data name="LoadColumnInfo2016andLater" xml:space="preserve">
177180
<value>DECLARE @Tablename nvarchar(100) = '{0}';
@@ -181,7 +184,7 @@ INNER JOIN sys.schemas s on s.schema_id = o.schema_id
181184
WHERE o.name = parsename(@TableName, 1) and s.name = parsename(@TableName, 2)
182185
);
183186
WITH cc as (
184-
SELECT c.name as COLUMN_NAME, c.is_identity, c.generated_always_type
187+
SELECT c.name as COLUMN_NAME, c.is_identity, c.generated_always_type, c.is_computed
185188
from sys.objects o
186189
INNER JOIN sys.columns c ON c.object_id = o.object_id
187190
WHERE o.object_id = @oid
@@ -192,6 +195,7 @@ LEFT JOIN (
192195
select tc.TABLE_SCHEMA, tc.TABLE_NAME, kcu.COLUMN_NAME, tc.constraint_type
193196
from information_schema.table_constraints tc
194197
join information_schema.key_column_usage kcu on
198+
tc.table_schema = kcu.table_schema and
195199
tc.table_name = kcu.table_name and
196200
tc.constraint_name = kcu.constraint_name
197201
where tc.table_name = parsename(@TableName, 1) and
@@ -200,7 +204,8 @@ LEFT JOIN (
200204
) as co on co.TABLE_SCHEMA = c.TABLE_SCHEMA and co.TABLE_NAME = c.TABLE_NAME and co.COLUMN_NAME = c.COLUMN_NAME
201205
LEFT JOIN cc ON cc.COLUMN_NAME = c.COLUMN_NAME
202206
where c.table_name = parsename(@TableName, 1)
203-
and c.table_schema = parsename(@TableName, 2)
204-
and cc.generated_always_type = 0</value>
207+
and c.table_schema = parsename(@TableName, 2)
208+
and cc.generated_always_type = 0
209+
and cc.is_computed = 0</value>
205210
</data>
206211
</root>

ScriptWriter.cs

Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Configuration;
4+
using System.Linq;
35
using System.Text;
46
using System.Data;
57
using System.IO;
@@ -15,14 +17,20 @@ public class ScriptWriter
1517
private DataTable _dt;
1618
DataView _dv;
1719
public bool OptionProcWrapUp = false;
18-
private string _BatchSeparator = "GO";
20+
private string _BatchSeparator = "GO";
21+
private List<string> _excludeDataTypes = new List<string>();
22+
1923

2024
public ScriptWriter(CAMOsoft.DbUtils.MsSqlSession db, string outputFolder)
2125
{
2226
_db = db;
2327
_OutputFolder = outputFolder;
2428
string sql = "SELECT @@SPID AS SPID, SUSER_NAME() AS UserName, DB_NAME() AS DbName, @@SERVERNAME AS ServerName, @@VERSION as ServerVersion;";
25-
_ServerInfoRow = _db.SelectRow(sql);
29+
_ServerInfoRow = _db.SelectRow(sql);
30+
31+
if (!string.IsNullOrEmpty(ConfigurationManager.AppSettings["excludeDataTypes"]))
32+
_excludeDataTypes = new List<string>(ConfigurationManager.AppSettings["excludeDataTypes"].Split(new char[] { ';' }));
33+
2634
InitTable();
2735
}
2836

@@ -92,8 +100,21 @@ private DataTable LoadColumnsInfo(ScriptObject so)
92100
if (IsSQLServer2016orLater()) queryDef = "LoadColumnInfo2016andLater";
93101
string sql = Properties.Resources.ResourceManager.GetString(queryDef);
94102
sql = sql.Replace("{0}", so.FullName);
95-
DataTable dt = _db.SelectTable(sql, "ColumnInfo");
96-
return dt;
103+
DataTable dt = _db.SelectTable(sql, "ColumnInfo");
104+
string filter = string.Empty;
105+
106+
if(_excludeDataTypes.Count >= 1)
107+
filter = string.Format("DATA_TYPE NOT in ({0})", string.Join(",", _excludeDataTypes.Select(x => string.Format("'{0}'", x))));
108+
109+
var filteredDr = dt.Select(filter);
110+
var filteredDt = new DataTable();
111+
112+
if (filteredDr.Length != 0)
113+
filteredDt = filteredDr.CopyToDataTable();
114+
filteredDt.TableName = dt.TableName;
115+
116+
return filteredDt;
117+
97118
}
98119

99120
private bool IsSQLServer2016orLater()
@@ -167,7 +188,10 @@ private StringBuilder SerializeRowValues(DataRow row, DataTable colInfoTable, st
167188
case "binary":
168189
case "varbinary":
169190
v = "0x" + ByteArrayToHex((byte[])row[col]);
170-
break;
191+
break;
192+
case "datetimeoffset":
193+
v = String.Format("'{0:yyyyMMdd HH:mm:ss.fffffff} {1}'", row[col], row[col].ToString().Substring(row[col].ToString().Length - 6));
194+
break;
171195
default:
172196
throw new Exception("Unknown SQL data type! (" + sqltype + ")");
173197
}
@@ -427,6 +451,15 @@ private void ScriptTableInitialInsert(ScriptObject so, DataTable colInfoTable, D
427451
}
428452

429453

454+
public string OutputFolder
455+
{
456+
get
457+
{
458+
return _OutputFolder;
459+
}
460+
}
461+
462+
430463
public string UserName {
431464
get
432465
{

frmMain.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,11 @@ private void bbiScript_ItemClick(object sender, DevExpress.XtraBars.ItemClickEve
7474
cnt++;
7575
}
7676
barStaticItem1.Caption = String.Format("Done. {0} tables were scripted.", cnt);
77+
DialogResult r = MessageBox.Show( "Do you want to open target location with File Explorer?", "Open target location", MessageBoxButtons.YesNo);
78+
if (r == DialogResult.Yes)
79+
{
80+
Process.Start("explorer.exe", _gen.OutputFolder);
81+
}
7782
}
7883

7984
private void gridControl1_DoubleClick(object sender, EventArgs e)

0 commit comments

Comments
 (0)