PageRenderTime 49ms CodeModel.GetById 22ms RepoModel.GetById 1ms app.codeStats 0ms

/branches/HP10.0-Release/Source/nHydrate.DataImport.SqlClient/SchemaModelHelper.cs

#
C# | 501 lines | 417 code | 40 blank | 44 comment | 62 complexity | c7f107907924eb1eba13c725ef078827 MD5 | raw file
Possible License(s): JSON, CC-BY-SA-3.0
  1. #region Copyright (c) 2006-2012 nHydrate.org, All Rights Reserved
  2. // --------------------------------------------------------------------- *
  3. // NHYDRATE.ORG *
  4. // Copyright (c) 2006-2012 All Rights reserved *
  5. // *
  6. // *
  7. // This file and its contents are protected by United States and *
  8. // International copyright laws. Unauthorized reproduction and/or *
  9. // distribution of all or any portion of the code contained herein *
  10. // is strictly prohibited and will result in severe civil and criminal *
  11. // penalties. Any violations of this copyright will be prosecuted *
  12. // to the fullest extent possible under law. *
  13. // *
  14. // THE SOURCE CODE CONTAINED HEREIN AND IN RELATED FILES IS PROVIDED *
  15. // TO THE REGISTERED DEVELOPER FOR THE PURPOSES OF EDUCATION AND *
  16. // TROUBLESHOOTING. UNDER NO CIRCUMSTANCES MAY ANY PORTION OF THE SOURCE *
  17. // CODE BE DISTRIBUTED, DISCLOSED OR OTHERWISE MADE AVAILABLE TO ANY *
  18. // THIRD PARTY WITHOUT THE EXPRESS WRITTEN CONSENT OF THE NHYDRATE GROUP *
  19. // *
  20. // UNDER NO CIRCUMSTANCES MAY THE SOURCE CODE BE USED IN WHOLE OR IN *
  21. // PART, AS THE BASIS FOR CREATING A PRODUCT THAT PROVIDES THE SAME, OR *
  22. // SUBSTANTIALLY THE SAME, FUNCTIONALITY AS THIS PRODUCT *
  23. // *
  24. // THE REGISTERED DEVELOPER ACKNOWLEDGES THAT THIS SOURCE CODE *
  25. // CONTAINS VALUABLE AND PROPRIETARY TRADE SECRETS OF NHYDRATE, *
  26. // THE REGISTERED DEVELOPER AGREES TO EXPEND EVERY EFFORT TO *
  27. // INSURE ITS CONFIDENTIALITY. *
  28. // *
  29. // THE END USER LICENSE AGREEMENT (EULA) ACCOMPANYING THE PRODUCT *
  30. // PERMITS THE REGISTERED DEVELOPER TO REDISTRIBUTE THE PRODUCT IN *
  31. // EXECUTABLE FORM ONLY IN SUPPORT OF APPLICATIONS WRITTEN USING *
  32. // THE PRODUCT. IT DOES NOT PROVIDE ANY RIGHTS REGARDING THE *
  33. // SOURCE CODE CONTAINED HEREIN. *
  34. // *
  35. // THIS COPYRIGHT NOTICE MAY NOT BE REMOVED FROM THIS FILE. *
  36. // --------------------------------------------------------------------- *
  37. #endregion
  38. using System;
  39. using System.Collections.Generic;
  40. using System.Linq;
  41. using System.Text;
  42. using System.Data;
  43. using System.Text.RegularExpressions;
  44. namespace nHydrate.DataImport.SqlClient
  45. {
  46. public class SchemaModelHelper : ISchemaModelHelper
  47. {
  48. #region Public Methods
  49. public bool IsValidConnectionString(string connectionString)
  50. {
  51. var valid = false;
  52. var conn = new System.Data.SqlClient.SqlConnection();
  53. try
  54. {
  55. conn.ConnectionString = connectionString;
  56. conn.Open();
  57. valid = true;
  58. }
  59. catch (Exception ex)
  60. {
  61. valid = false;
  62. }
  63. finally
  64. {
  65. conn.Close();
  66. }
  67. return valid;
  68. }
  69. public bool IsSupportedSQLVersion(string connectionString)
  70. {
  71. var ds = DatabaseHelper.ExecuteDataset(connectionString, "SELECT SERVERPROPERTY('productversion')");
  72. var version = (string)ds.Tables[0].Rows[0][0];
  73. if (version.StartsWith("10."))
  74. return true;
  75. else if (version.StartsWith("9."))
  76. return true;
  77. else
  78. return false;
  79. }
  80. public SQLServerTypeConstants GetSQLVersion(string connectionString)
  81. {
  82. var ds = DatabaseHelper.ExecuteDataset(connectionString, "SELECT SERVERPROPERTY('productversion')");
  83. var version = (string)ds.Tables[0].Rows[0][0];
  84. if (version.StartsWith("10."))
  85. {
  86. var ds2 = DatabaseHelper.ExecuteDataset(connectionString, "SELECT SERVERPROPERTY('Edition')");
  87. var version2 = (string)ds2.Tables[0].Rows[0][0];
  88. if (version2 == "SQL Azure")
  89. return SQLServerTypeConstants.SQLAzure;
  90. else
  91. return SQLServerTypeConstants.SQL2008;
  92. }
  93. else
  94. {
  95. return SQLServerTypeConstants.SQL2005;
  96. }
  97. }
  98. #endregion
  99. internal static string GetSqlDatabaseTables()
  100. {
  101. var sb = new StringBuilder();
  102. sb.AppendLine("DECLARE @bar varchar(150)");
  103. sb.AppendLine("DECLARE @val varchar(150)");
  104. sb.AppendLine("DECLARE @tab table");
  105. sb.AppendLine("(");
  106. sb.AppendLine("xName varchar(150) NOT NULL,");
  107. sb.AppendLine("xValue varchar(150) NULL,");
  108. sb.AppendLine("xSchema varchar(150) NOT NULL");
  109. sb.AppendLine(")");
  110. sb.AppendLine("INSERT INTO @tab SELECT so.name, null, sc.name [schema] FROM sys.tables so INNER JOIN sys.schemas sc ON so.schema_id = sc.schema_id WHERE so.name <> 'dtproperties' AND (so.name <> 'sysdiagrams') AND (so.name <> '__nhydrateschema') AND NOT (so.name like '__AUDIT__%')");
  111. sb.AppendLine("select xName as name, xSchema as [schema], xValue selectionCriteria from @tab WHERE xName <> 'dtproperties' ORDER BY xName");
  112. return sb.ToString();
  113. }
  114. internal static string GetSqlColumnsForTable()
  115. {
  116. return GetSqlColumnsForTable(null);
  117. }
  118. internal static string GetSqlForUniqueConstraints()
  119. {
  120. var sb = new StringBuilder();
  121. sb.AppendLine("select o.name as TableName, col.name as ColumnName");
  122. sb.AppendLine("from sys.indexes i inner join sys.objects o on i.object_id = o.object_id ");
  123. sb.AppendLine(" inner join sys.index_columns ic on i.index_id = ic.index_id and ic.object_id = o.object_id");
  124. sb.AppendLine(" INNER JOIN sys.columns col ON ic.object_id = col.object_id and ic.column_id = col.column_id");
  125. sb.AppendLine("where i.is_unique = 1 and is_primary_key = 0 and is_unique_constraint = 1");
  126. return sb.ToString();
  127. }
  128. internal static string GetSqlForIndexes()
  129. {
  130. var sb = new StringBuilder();
  131. sb.AppendLine();
  132. sb.AppendLine("SELECT ");
  133. sb.AppendLine(" ind.name as indexname");
  134. sb.AppendLine(" ,ind.is_primary_key");
  135. sb.AppendLine(" --,ind.index_id ");
  136. sb.AppendLine(" --,ic.index_column_id ");
  137. sb.AppendLine(" ,t.name as tablename");
  138. sb.AppendLine(" ,col.name as columnname");
  139. sb.AppendLine(" ,ic.is_descending_key");
  140. sb.AppendLine(" ,ic.key_ordinal");
  141. sb.AppendLine(" ,ind.type_desc");
  142. sb.AppendLine(" ,ind.is_unique_constraint");
  143. sb.AppendLine(" ,ind.is_primary_key");
  144. sb.AppendLine(" --,ic.* ");
  145. sb.AppendLine(" --,col.* ");
  146. sb.AppendLine(" --,ind.* ");
  147. sb.AppendLine("FROM sys.indexes ind ");
  148. sb.AppendLine("INNER JOIN sys.index_columns ic ");
  149. sb.AppendLine(" ON ind.object_id = ic.object_id and ind.index_id = ic.index_id ");
  150. sb.AppendLine("INNER JOIN sys.columns col ");
  151. sb.AppendLine(" ON ic.object_id = col.object_id and ic.column_id = col.column_id ");
  152. sb.AppendLine("INNER JOIN sys.tables t ");
  153. sb.AppendLine(" ON ind.object_id = t.object_id ");
  154. sb.AppendLine("WHERE (1=1) ");
  155. //sb.AppendLine(" AND ind.is_primary_key = 0 ");
  156. //sb.AppendLine(" AND ind.is_unique = 0 ");
  157. //sb.AppendLine(" AND ind.is_unique_constraint = 0 ");
  158. sb.AppendLine(" AND t.is_ms_shipped = 0 ");
  159. sb.AppendLine(" AND ic.key_ordinal <> 0");
  160. sb.AppendLine("ORDER BY ");
  161. sb.AppendLine(" ind.name, ic.key_ordinal");
  162. return sb.ToString();
  163. }
  164. internal static string GetSqlColumnsForComputed()
  165. {
  166. var sb = new StringBuilder();
  167. sb.AppendLine("select o.name as tablename, c.name as columnname, c.definition");
  168. sb.AppendLine("from sys.computed_columns c inner join sys.objects o on c.object_id = o.object_id");
  169. return sb.ToString();
  170. }
  171. internal static string GetSqlColumnsForTable(string tableName)
  172. {
  173. var sb = new StringBuilder();
  174. sb.AppendLine("SELECT");
  175. sb.AppendLine(" c.ORDINAL_POSITION as colorder,");
  176. sb.AppendLine(" c.TABLE_NAME as tablename,");
  177. sb.AppendLine(" c.COLUMN_NAME as columnname,");
  178. sb.AppendLine("(");
  179. sb.AppendLine("select top 1 c1.name");
  180. sb.AppendLine("from sys.indexes i");
  181. sb.AppendLine("join sysobjects o ON i.object_id = o.id");
  182. sb.AppendLine("join sysobjects pk ON i.name = pk.name");
  183. sb.AppendLine("AND pk.parent_obj = i.object_id");
  184. sb.AppendLine("AND pk.xtype = 'PK'");
  185. sb.AppendLine("join sys.index_columns ik on i.object_id = ik.object_id");
  186. sb.AppendLine("and i.index_id = ik.index_id");
  187. sb.AppendLine("join syscolumns c1 ON ik.object_id = c1.id");
  188. sb.AppendLine("AND ik.column_id = c1.colid");
  189. sb.AppendLine("AND c1.name = c.COLUMN_NAME");
  190. sb.AppendLine("where o.name = c.TABLE_NAME");
  191. sb.AppendLine(") as [isPrimaryKey],");
  192. sb.AppendLine(" case WHEN");
  193. sb.AppendLine(" (");
  194. sb.AppendLine(" SELECT ");
  195. sb.AppendLine(" count(*) ");
  196. sb.AppendLine(" FROM ");
  197. sb.AppendLine(" INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE foreignkeyccu");
  198. sb.AppendLine(" INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS foreignkeytc on foreignkeyccu.CONSTRAINT_NAME = foreignkeytc.CONSTRAINT_NAME AND");
  199. sb.AppendLine(" foreignkeyccu.CONSTRAINT_SCHEMA = foreignkeytc.CONSTRAINT_SCHEMA AND");
  200. sb.AppendLine(" foreignkeytc.CONSTRAINT_TYPE = 'FOREIGN KEY'");
  201. sb.AppendLine(" WHERE");
  202. sb.AppendLine(" foreignkeyccu.TABLE_SCHEMA = c.TABLE_SCHEMA AND");
  203. sb.AppendLine(" foreignkeyccu.TABLE_NAME = c.TABLE_NAME AND");
  204. sb.AppendLine(" foreignkeyccu.COLUMN_NAME = c.COLUMN_NAME ");
  205. sb.AppendLine(" ) > 0 THEN 'true' ELSE 'false' END as isForeignKey,");
  206. sb.AppendLine(" c.DATA_TYPE as datatype,");
  207. sb.AppendLine(" s.xtype,");
  208. sb.AppendLine(" c.numeric_precision AS [precision], c.numeric_scale AS [scale],");
  209. sb.AppendLine(" case when c.CHARACTER_MAXIMUM_LENGTH is null or c.CHARACTER_MAXIMUM_LENGTH > 8000 then s.length else c.CHARACTER_MAXIMUM_LENGTH end as length,");
  210. sb.AppendLine(" case when c.IS_NULLABLE = 'No' then 'false' else 'true' end as allowNull, ");
  211. sb.AppendLine(" case when c.COLUMN_DEFAULT is null then '' else c.COLUMN_DEFAULT end as defaultValue,");
  212. sb.AppendLine(" case when COLUMNPROPERTY(OBJECT_ID(c.TABLE_SCHEMA+'.'+c.TABLE_NAME), COLUMN_NAME, 'IsIdentity') = 1 then 'true' else 'false' end as isIdentity,");
  213. sb.AppendLine(" c.COLLATION_NAME AS collation");
  214. sb.AppendLine(" FROM ");
  215. sb.AppendLine(" INFORMATION_SCHEMA.COLUMNS c ");
  216. sb.AppendLine(" INNER JOIN systypes s on s.name = c.DATA_TYPE");
  217. if (!string.IsNullOrEmpty(tableName))
  218. sb.AppendLine(" WHERE c.TABLE_NAME = '" + tableName + "'");
  219. sb.AppendLine(" ORDER BY");
  220. sb.AppendLine(" c.TABLE_NAME,");
  221. sb.AppendLine(" c.ORDINAL_POSITION");
  222. return sb.ToString();
  223. }
  224. internal static string GetSqlForRelationships()
  225. {
  226. var sb = new StringBuilder();
  227. sb.AppendLine("SELECT ");
  228. sb.AppendLine(" KCU1.CONSTRAINT_NAME AS 'FK_CONSTRAINT_NAME'");
  229. sb.AppendLine(" , KCU1.TABLE_NAME AS 'FK_TABLE_NAME'");
  230. sb.AppendLine(" , KCU1.COLUMN_NAME AS 'FK_COLUMN_NAME' ");
  231. sb.AppendLine(" , KCU2.TABLE_NAME AS 'UQ_TABLE_NAME'");
  232. sb.AppendLine(" , KCU2.COLUMN_NAME AS 'UQ_COLUMN_NAME'");
  233. sb.AppendLine(" , so.id");
  234. sb.AppendLine("FROM ");
  235. sb.AppendLine(" INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS RC");
  236. sb.AppendLine(" JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE KCU1");
  237. sb.AppendLine(" ON KCU1.CONSTRAINT_CATALOG = RC.CONSTRAINT_CATALOG ");
  238. sb.AppendLine(" AND KCU1.CONSTRAINT_SCHEMA = RC.CONSTRAINT_SCHEMA");
  239. sb.AppendLine(" AND KCU1.CONSTRAINT_NAME = RC.CONSTRAINT_NAME");
  240. sb.AppendLine("JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE KCU2");
  241. sb.AppendLine(" ON KCU2.CONSTRAINT_CATALOG = RC.UNIQUE_CONSTRAINT_CATALOG ");
  242. sb.AppendLine(" AND KCU2.CONSTRAINT_SCHEMA = RC.UNIQUE_CONSTRAINT_SCHEMA");
  243. sb.AppendLine(" AND KCU2.CONSTRAINT_NAME = RC.UNIQUE_CONSTRAINT_NAME");
  244. sb.AppendLine(" AND KCU2.ORDINAL_POSITION = KCU1.ORDINAL_POSITION");
  245. sb.AppendLine("JOIN sysobjects so");
  246. sb.AppendLine(" ON KCU1.CONSTRAINT_NAME = so.name");
  247. sb.AppendLine("WHERE");
  248. sb.AppendLine(" so.xtype = 'F'");
  249. sb.AppendLine("ORDER BY");
  250. sb.AppendLine(" KCU1.CONSTRAINT_NAME,");
  251. sb.AppendLine(" KCU1.ORDINAL_POSITION");
  252. return sb.ToString();
  253. }
  254. internal static string GetSqlIndexesForTable()
  255. {
  256. var sb = new StringBuilder();
  257. sb.AppendLine("select t.name as tablename, i.name as indexname, c.name as columnname, i.is_primary_key");
  258. sb.AppendLine("from sys.tables t");
  259. sb.AppendLine("inner join sys.indexes i on i.object_id = t.object_id");
  260. sb.AppendLine("inner join sys.index_columns ic on ic.object_id = t.object_id");
  261. sb.AppendLine("inner join sys.columns c on c.object_id = t.object_id and");
  262. sb.AppendLine("ic.column_id = c.column_id");
  263. //sb.AppendLine("select o.name as tablename, i.name as indexname, i.is_primary_key from sys.objects o inner join sys.indexes i on o.object_id = i.object_id where o.[type] = 'U'");
  264. return sb.ToString();
  265. }
  266. internal static string GetSqlForViews()
  267. {
  268. var sb = new StringBuilder();
  269. sb.AppendLine("select s.name as schemaname, v.name, m.definition from sys.views v inner join sys.sql_modules m on v.object_id = m.object_id inner join sys.schemas s on s.schema_id= v.schema_id");
  270. return sb.ToString();
  271. }
  272. internal static string GetViewBody(string sql)
  273. {
  274. var regEx = new Regex(@"CREATE VIEW[\r\n\s]*[a-zA-Z0-9\[\]_\.]*[\r\n\s]*AS[\r\n\s]*([\s\S\r\n]*)", RegexOptions.IgnoreCase);
  275. var match = regEx.Match(sql);
  276. if (match != null && match.Groups != null && match.Groups.Count == 2)
  277. sql = match.Groups[1].Value;
  278. else
  279. {
  280. sql = sql.Replace("\r", string.Empty);
  281. var arr = sql.Split('\n').ToList();
  282. var sb = new StringBuilder();
  283. var inBody = false;
  284. foreach (var lineText in arr)
  285. {
  286. //This is FAR from perfect. It assumes the creation line ends with the "AS" keyword for a stored proc
  287. if (inBody)
  288. {
  289. sb.AppendLine(lineText);
  290. }
  291. else if (!inBody && (lineText.ToLower().Trim().EndsWith(" as") || lineText.ToLower().Trim() == "as"))
  292. {
  293. inBody = true;
  294. }
  295. }
  296. sql = sb.ToString();
  297. }
  298. return sql.Trim();
  299. }
  300. internal static string GetSqlForViewsColumns()
  301. {
  302. var sb = new StringBuilder();
  303. sb.AppendLine("select v.name as viewname, c.name as columnname, c.system_type_id, c.max_length, c.precision, c.scale, c.is_nullable from sys.views v inner join sys.columns c on v.object_id = c.object_id order by v.name, c.name");
  304. return sb.ToString();
  305. }
  306. internal static string GetSqlForFunctions()
  307. {
  308. var sb = new StringBuilder();
  309. sb.AppendLine("select o.*, s.name as schemaname from sys.objects o inner join sys.schemas s on o.schema_id = s.schema_id WHERE [type] IN ('FN', 'IF', 'TF') and o.name <> 'fn_diagramobjects'");
  310. return sb.ToString();
  311. }
  312. internal static string GetFunctionBody(string schema, string name, string connectionString)
  313. {
  314. var sb = new StringBuilder();
  315. var ds = DatabaseHelper.ExecuteDataset(connectionString, "sp_helptext '[" + schema + "].[" + name + "]'");
  316. foreach (DataRow dr in ds.Tables[0].Rows)
  317. {
  318. var t = (string)dr["Text"] + string.Empty;
  319. sb.AppendLine(t.Replace("\r\n", string.Empty).Replace("\r", string.Empty).Replace("\n", string.Empty));
  320. }
  321. var sql = sb.ToString();
  322. var regEx = new Regex(@"CREATE\s*FUNCTION[\r\n\s]*[a-zA-Z0-9\[\]_\.]*.*RETURNS.*AS[\r\n\s]+(RETURN[\s\S\r\n]*)", RegexOptions.IgnoreCase | RegexOptions.Singleline);
  323. var match = regEx.Match(sql);
  324. if (match != null && match.Groups != null && match.Groups.Count == 2)
  325. {
  326. sql = match.Groups[1].Value;
  327. }
  328. else
  329. {
  330. regEx = new Regex(@"CREATE\s*FUNCTION[\r\n\s]*[a-zA-Z0-9\[\]_\.]*.*RETURNS.*(BEGIN[\s\S\r\n]*)", RegexOptions.IgnoreCase | RegexOptions.Singleline);
  331. match = regEx.Match(sql);
  332. if (match != null && match.Groups != null && match.Groups.Count == 2)
  333. {
  334. sql = match.Groups[1].Value;
  335. }
  336. else
  337. {
  338. regEx = new Regex(@"CREATE\s*FUNCTION[\r\n\s]*[a-zA-Z0-9\[\]_\.]*.*RETURNS.*AS[\r\n\s]+([\s\S\r\n]*)", RegexOptions.IgnoreCase | RegexOptions.Singleline);
  339. match = regEx.Match(sql);
  340. if (match != null && match.Groups != null && match.Groups.Count == 2)
  341. sql = match.Groups[1].Value;
  342. else
  343. System.Diagnostics.Debug.Write(string.Empty);
  344. }
  345. }
  346. return sql.Trim();
  347. }
  348. internal static string GetSqlForStoredProceduresParameters()
  349. {
  350. var sb = new StringBuilder();
  351. sb.AppendLine("SELECT dbo.syscolumns.xtype, dbo.sysobjects.name, dbo.sysobjects.id,");
  352. sb.AppendLine(" dbo.syscolumns.name AS ColName,");
  353. sb.AppendLine(" dbo.systypes.name AS ColType,");
  354. sb.AppendLine(" dbo.syscolumns.isnullable,");
  355. sb.AppendLine(" dbo.syscolumns.length,");
  356. sb.AppendLine(" dbo.syscolumns.isoutparam");
  357. sb.AppendLine("FROM dbo.sysobjects INNER JOIN");
  358. sb.AppendLine(" dbo.syscolumns ON dbo.sysobjects.id = dbo.syscolumns.id INNER JOIN");
  359. sb.AppendLine(" dbo.systypes ON dbo.syscolumns.xtype = dbo.systypes.xtype");
  360. sb.AppendLine("WHERE (dbo.sysobjects.category = 0) AND");
  361. sb.AppendLine(" (dbo.sysobjects.xtype = 'P') AND");
  362. sb.AppendLine(" NOT (dbo.sysobjects.name LIKE 'gen_%') AND");
  363. sb.AppendLine(" NOT (dbo.sysobjects.name LIKE 'dt_%') AND");
  364. sb.AppendLine(" NOT (dbo.sysobjects.name LIKE 'sp[_]%diagram%') AND");
  365. sb.AppendLine(" dbo.systypes.name <> 'sysname' AND");
  366. sb.AppendLine(" (dbo.sysobjects.uid in (select uid from dbo.sysusers))");
  367. sb.AppendLine("ORDER BY");
  368. sb.AppendLine(" dbo.sysobjects.name, dbo.syscolumns.name");
  369. return sb.ToString();
  370. }
  371. internal static string GetSqlForStoredProceduresColumns(StoredProc sp)
  372. {
  373. var sb = new StringBuilder();
  374. System.Windows.Forms.Application.DoEvents();
  375. sb.AppendLine("SET FMTONLY ON");
  376. sb.Append("EXEC [" + (string.IsNullOrEmpty(sp.Schema) ? "dbo" : sp.Schema) + "].[" + sp.Name + "] ");
  377. foreach (var parameter in sp.ParameterList)
  378. {
  379. if (parameter.DataType == SqlDbType.UniqueIdentifier)
  380. sb.Append("@" + parameter.Name + "='540C6D43-5645-40FB-980F-2FF126BFBD5E'");
  381. else if (parameter.IsTextType())
  382. sb.Append("@" + parameter.Name + "=''");
  383. else if (parameter.IsNumericType())
  384. sb.Append("@" + parameter.Name + "=0");
  385. else if (parameter.IsBinaryType())
  386. sb.Append("@" + parameter.Name + "=0x0");
  387. else if (parameter.DataType == SqlDbType.Bit)
  388. sb.Append("@" + parameter.Name + "=0");
  389. else if (parameter.IsDateType())
  390. sb.Append("@" + parameter.Name + "='2000-01-01'");
  391. else
  392. System.Diagnostics.Debug.Write(string.Empty);
  393. if (sp.ParameterList.IndexOf(parameter) < sp.ParameterList.Count - 1)
  394. sb.Append(", ");
  395. }
  396. sb.AppendLine();
  397. return sb.ToString();
  398. }
  399. internal static string GetSqlForStoredProceduresBody(string schema, string spName, string connectionString)
  400. {
  401. var sb = new StringBuilder();
  402. var ds = DatabaseHelper.ExecuteDataset(connectionString, "sp_helptext '[" + schema + "].[" + spName + "]'");
  403. if (ds.Tables.Count > 0)
  404. {
  405. foreach (DataRow dr in ds.Tables[0].Rows)
  406. {
  407. sb.Append(((string)dr[0]).Replace("\r", string.Empty));
  408. }
  409. var arr = sb.ToString().Split('\n').ToList();
  410. sb = new StringBuilder();
  411. var inBody = false;
  412. foreach (var lineText in arr)
  413. {
  414. var lineText2 = StripComments(lineText);
  415. //This is FAR from perfect. It assumes the creation line ends with the "AS" keyword for a stored proc
  416. if (inBody)
  417. {
  418. sb.AppendLine(lineText);
  419. }
  420. else if (!inBody && (lineText2.ToLower().Trim().EndsWith(" as") || lineText2.ToLower().Trim() == "as"))
  421. {
  422. inBody = true;
  423. }
  424. }
  425. }
  426. return sb.ToString().Trim();
  427. }
  428. internal static string GetSqlForStoredProcedures()
  429. {
  430. return GetSqlForStoredProcedures(null);
  431. }
  432. internal static string GetSqlForStoredProcedures(string name)
  433. {
  434. var sb = new StringBuilder();
  435. sb.AppendLine("SELECT OBJECT_SCHEMA_NAME(id) as schemaname, dbo.sysobjects.id, dbo.sysobjects.xtype, dbo.sysobjects.name");
  436. sb.AppendLine("FROM dbo.sysobjects");
  437. sb.AppendLine("WHERE (dbo.sysobjects.category = 0) AND");
  438. sb.AppendLine(" (dbo.sysobjects.xtype = 'P') AND");
  439. sb.AppendLine(" NOT (dbo.sysobjects.name LIKE 'gen_%') AND");
  440. sb.AppendLine(" NOT (dbo.sysobjects.name LIKE 'dt_%') AND");
  441. sb.AppendLine(" NOT (dbo.sysobjects.name LIKE 'sp[_]%diagram%') AND");
  442. if (!string.IsNullOrEmpty(name))
  443. {
  444. sb.AppendLine(" (dbo.sysobjects.name = '" + name + "') AND");
  445. }
  446. sb.AppendLine(" (dbo.sysobjects.uid in (select uid from dbo.sysusers))");
  447. sb.AppendLine("ORDER BY dbo.sysobjects.name");
  448. return sb.ToString();
  449. }
  450. /// <summary>
  451. /// Not perfect!! Just strips off what looks like comment
  452. /// </summary>
  453. private static string StripComments(string sql)
  454. {
  455. if (string.IsNullOrEmpty(sql)) return sql;
  456. var index = sql.IndexOf("--");
  457. if (index == -1) return sql;
  458. return sql.Substring(0, index);
  459. }
  460. }
  461. }