Advertisement
Guest User

Untitled

a guest
Feb 11th, 2016
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.34 KB | None | 0 0
  1. SET QUOTED_IDENTIFIER OFF
  2. GO
  3. SET ANSI_NULLS OFF
  4. GO
  5.  
  6. /* *********************************************************************************
  7. -- CHANGE LOG
  8. -- *********************************************************************************
  9.  
  10. -- Date Changed Who Desc/Comments
  11. -- ------------ -------- ----------------------------------------------------------
  12. -- 12/10/2015 This Guy Created - Gets any Core data by Xtend table name
  13. and specially formatted where clause.
  14.  
  15. Parameters:
  16. @tableName is the name of the xtend
  17. table. It must begin with 'xb' or the sproc
  18. returns 0.
  19. @returnColumns is a comma delimited list of columns
  20. in the Core (bu) table that are returned. '*' can
  21. be passed in to retrieve all the columns in the
  22. Core table (None of the columns in the joined tables will be returned).
  23. @whereClauses (@xbWhereClause - required, @coreWhereClause -optional)
  24. are comma delimited where clauses in the
  25. following format: {column}:{operator}:{Value}
  26. All clauses are treated as 'AND' clauses.
  27. Example:
  28. Special_Request_Created:>:1/1/2013,Special_Request_Created:<:1/1/2016
  29. This evaluates to
  30. WHERE
  31. (
  32. xb.Special_Request_Created > '1/1/2013'
  33. AND
  34. xb.Special_Request_Created < '1/1/2016'
  35. )
  36. SPECIAL CASE
  37. When the Operator is 'IN' the user needs to wrap
  38. the clause with parens () and quote string data.
  39. Also, the comma (,) needs to be designated as [c]
  40. Special_Request_ID:IN:(3456[c]6789)
  41. Latest_Special_Status:IN:(''New''[c]''Final'')
  42. @joinClause is a comma delimited list of table joins in the following format:
  43. {column in core table:coreTable2:column}.
  44. Example:
  45. Foo_Detail_Line_ID:buFoo_Detail_Line:Foo_Detail_Line_ID,
  46. Foo_ID:buFoo_Header:Foo_ID
  47. This evaluates to
  48. JOIN buFoo_Detail_Line bu2
  49. ON bu.Foo_Detail_Line_ID = bu2.Auth_Detail_Line_ID
  50. JOIN buFoo_Header bu3
  51. ON bu2.Foo_ID = bu3.Foo_ID
  52.  
  53.  
  54. This script returns data in the following format:
  55. Id Key Value
  56. Table PK Column Name Column Value
  57.  
  58. -- *********************************************************************************/
  59.  
  60. CREATE PROCEDURE [API].[GetCoreFieldsByXtendColumnValues]
  61. (
  62. @tableName varchar(128),
  63. @returnColumns varchar(max),
  64. @xbWhereClause nvarchar(max),
  65. @coreWhereClause nvarchar(max) = '',
  66. @joinClause nvarchar(max) = ''
  67. )
  68. AS
  69.  
  70. BEGIN
  71. SET NOCOUNT ON;
  72.  
  73. DECLARE @SQL nvarchar(max) = '',
  74. @columns nvarchar(max),
  75. @conversion nvarchar(max),
  76. @pk nvarchar(max);
  77. DECLARE @coreTableName varchar(128) = 'bu' + RIGHT(@tableName,LEN(@tableName)-2)
  78.  
  79. IF((SELECT LEFT(@tableName,2)) = 'xb')
  80. BEGIN
  81.  
  82. DECLARE @columnTable TABLE
  83. (
  84. COLUMN_NAME nvarchar(max)
  85. )
  86. --Get Columns and Verify they exist in the table
  87.  
  88. IF (@returnColumns = '*')
  89. BEGIN
  90. INSERT INTO @columnTable
  91. SELECT 'bu.' + c.COLUMN_NAME
  92. FROM INFORMATION_SCHEMA.COLUMNS c
  93. WHERE c.TABLE_NAME = @coreTableName
  94.  
  95. INSERT INTO @columnTable
  96. SELECT 'xb.' + c.COLUMN_NAME
  97. FROM INFORMATION_SCHEMA.COLUMNS c
  98. WHERE c.TABLE_NAME = @tableName
  99. AND NOT EXISTS (SELECT 1 FROM @columnTable WHERE COLUMN_NAME = 'bu.'+c.COLUMN_NAME)
  100. END
  101. ELSE
  102. BEGIN
  103. INSERT INTO @columnTable
  104. SELECT 'bu.' + c.COLUMN_NAME
  105. FROM dbo.AESplit(@returnColumns) r
  106. JOIN INFORMATION_SCHEMA.COLUMNS c
  107. ON r.ArrayColumn = c.COLUMN_NAME
  108. WHERE c.TABLE_NAME = @coreTableName
  109.  
  110. INSERT INTO @columnTable
  111. SELECT 'xb.' + c.COLUMN_NAME
  112. FROM dbo.AESplit(@returnColumns) r
  113. JOIN INFORMATION_SCHEMA.COLUMNS c
  114. ON r.ArrayColumn = c.COLUMN_NAME
  115. WHERE c.TABLE_NAME = @tableName
  116. AND NOT EXISTS (SELECT 1 FROM @columnTable WHERE COLUMN_NAME = 'bu.'+c.COLUMN_NAME)
  117. END
  118.  
  119. DECLARE @pkTable table(
  120. DB varchar(255),
  121. [SCHEMA] varchar(255),
  122. [TABLE] varchar(255),
  123. [COLUMN] varchar(max),
  124. [KEY_SEQ] int,
  125. [PK_NAME] nvarchar(255)
  126. );
  127.  
  128. INSERT INTO @pkTable
  129. EXEC sp_pkeys @tableName
  130.  
  131. SET @pk = (SELECT TOP 1 [COLUMN] FROM @pkTable)
  132.  
  133.  
  134. SELECT @columns = (SELECT STUFF((Select ','+ RIGHT(C.COLUMN_NAME,LEN(C.COLUMN_NAME)-3)
  135. FROM @columnTable C
  136. FOR XML PATH('')),1,1,''))
  137.  
  138. SELECT @conversion = (SELECT STUFF((SELECT ', CONVERT(VARCHAR(MAX), '+ C.COLUMN_NAME + ',120) AS ' + RIGHT(C.COLUMN_NAME,LEN(C.COLUMN_NAME)-3)
  139. FROM @columnTable C
  140. FOR XML PATH('')),1,1,''))
  141.  
  142. --Set up Where Clauses TODO: This should be a CTE to avoid duplication
  143. DECLARE @whereTable1 table
  144. (
  145. Id int Primary Key,
  146. Value nvarchar(max)
  147. )
  148.  
  149. DECLARE @whereTable2 table
  150. (
  151. Id int,
  152. IndexNum int,
  153. Value nvarchar(max)
  154. )
  155.  
  156. DECLARE @formattedXbWhere nvarchar(max) = '',
  157. @formattedCoreWhere nvarchar(max) = '',
  158. @formattedJoin nvarchar(max) = ''
  159.  
  160. --xbWhereClause
  161. BEGIN
  162. INSERT INTO @whereTable1 (Id, Value)
  163. SELECT t.IndexNum, t.Data
  164. FROM dbo.SplitString(@xbWhereClause,',') t
  165.  
  166. INSERT INTO @whereTable2
  167. SELECT t.Id, v.IndexNum, v.Data
  168. FROM @whereTable1 t
  169. CROSS APPLY dbo.SplitString(t.Value,':') v
  170.  
  171. --SELECT * from @whereTable2
  172.  
  173. SELECT @formattedXbWhere += N'WHERE (' + STUFF((Select ' AND '
  174. + 'xb.' + pvt.[1] + ' '
  175. + pvt.[2] + ' '
  176. + CASE
  177. WHEN pvt.[2] = 'IN' THEN pvt.[3]
  178. WHEN (ISNUMERIC(pvt.[3]) = 0) THEN '''' + pvt.[3] + ''''
  179. ELSE pvt.[3]
  180. END
  181. FROM (
  182. SELECT Id, IndexNum, Value
  183. FROM @whereTable2
  184. ) as p
  185. PIVOT
  186. (
  187. MAX(Value)
  188. FOR IndexNum IN ([1],[2],[3])
  189. ) AS pvt
  190. FOR XML PATH('')),1,5,'') + ' )'
  191.  
  192. SET @formattedXbWhere = REPLACE(REPLACE(REPLACE(@formattedXbWhere,'>','>'),'<','<'),'[c]',',')
  193. --SELECT @formattedXbWhere
  194. END
  195.  
  196. --coreWhereClause
  197. IF (@coreWhereClause <> '')
  198. BEGIN
  199. PRINT 'Core WHERE Exists';
  200. DELETE FROM @whereTable1
  201. DELETE FROM @whereTable2
  202.  
  203. INSERT INTO @whereTable1 (Id, Value)
  204. SELECT t.IndexNum, t.Data
  205. FROM dbo.SplitString(@coreWhereClause,',') t
  206.  
  207. INSERT INTO @whereTable2
  208. SELECT t.Id, v.IndexNum, v.Data
  209. FROM @whereTable1 t
  210. CROSS APPLY dbo.SplitString(t.Value,':') v
  211.  
  212. --SELECT * from @whereTable2
  213.  
  214. SELECT @formattedCoreWhere += N' AND (' + STUFF((Select ' AND '
  215. + CASE
  216. WHEN (SELECT COUNT(1) FROM @columnTable WHERE COLUMN_NAME = pvt.[1]) = 1 THEN 'bu.' + pvt.[1] + ' '
  217. ELSE pvt.[1] + ' '
  218. END
  219. --+'bu.' + pvt.[1] + ' '
  220. + pvt.[2] + ' '
  221. + CASE
  222. WHEN pvt.[2] = 'IN' THEN pvt.[3]
  223. WHEN (ISNUMERIC(pvt.[3]) = 0) THEN '''' + pvt.[3] + ''''
  224. ELSE pvt.[3]
  225. END
  226. FROM (
  227. SELECT Id, IndexNum, Value
  228. FROM @whereTable2
  229. ) as p
  230. PIVOT
  231. (
  232. MAX(Value)
  233. FOR IndexNum IN ([1],[2],[3])
  234. ) AS pvt
  235. FOR XML PATH('')),1,5,'') + ' )'
  236.  
  237. SET @formattedCoreWhere = REPLACE(REPLACE(REPLACE(@formattedCoreWhere,'>','>'),'<','<'),'[c]',',')
  238. --SELECT @formattedCoreWhere;
  239. END
  240.  
  241. --Set Up Join Clause
  242. IF (@joinClause <> '')
  243. BEGIN
  244. PRINT 'JOIN Exists';
  245.  
  246. DELETE FROM @whereTable1
  247. DELETE FROM @whereTable2
  248.  
  249. INSERT INTO @whereTable1 (Id, Value)
  250. SELECT t.IndexNum, t.Data
  251. FROM dbo.SplitString(@joinClause,',') t
  252.  
  253. INSERT INTO @whereTable2
  254. SELECT t.Id, v.IndexNum, v.Data
  255. FROM @whereTable1 t
  256. CROSS APPLY dbo.SplitString(t.Value,':') v
  257.  
  258. --SELECT * from @whereTable2
  259.  
  260. SELECT @formattedJoin += 'JOIN ' + STUFF((Select 'JOIN ' +
  261. + pvt.[2] + ' bu' + CONVERT(varchar(10),Id) + ' ON ' +
  262. CASE WHEN Id = 1 THEN ' bu.'
  263. ELSE ' bu' + CONVERT(varchar(10),Id-1) + '.' END
  264. + pvt.[1] + ' = bu' + CONVERT(varchar(10),Id) + '.'
  265. + pvt.[3] + ' '
  266. FROM (
  267. SELECT Id, IndexNum, Value
  268. FROM @whereTable2
  269. ) as p
  270. PIVOT
  271. (
  272. MAX(Value)
  273. FOR IndexNum IN ([1],[2],[3])
  274. ) AS pvt
  275. FOR XML PATH('')),1,4,'')
  276.  
  277. END
  278.  
  279. SELECT @SQL += N'SELECT DISTINCT ' + @pk + '2 AS Id, [Key], [Value] FROM (SELECT bu.' + @pk + ' AS ' + @pk + '2, ' + @conversion +
  280. ' FROM ' + @coreTableName + ' bu JOIN ' + @tableName + ' xb ON bu.' + @pk + ' = xb.' + @pk
  281. + ' ' + @formattedJoin
  282. + ' ' + @formattedXbWhere +
  283. CASE
  284. WHEN @formattedCoreWhere <> '' THEN @formattedCoreWhere
  285. ELSE ''
  286. END
  287. + ') x ' --+' WHERE ' + @columnName + ' = ' + @columnValue +') x '
  288. + 'UNPIVOT ( [Value] FOR [Key] IN (' + @columns + ')) AS unpiv'
  289.  
  290. --SELECT @SQL AS query;
  291. EXEC sp_executesql @SQL
  292. END
  293. ELSE RETURN 0
  294. END
  295. GO
  296. /*
  297.  
  298. --Example:
  299.  
  300. EXEC [API].[GetCoreFieldsByXtendColumnValues] 'xbSpecial_Request', '*','Latest_Special_Status:=:New', 'Vendor_ID:=:123456','Foo_Detail_Line_ID:buFoo_Detail_Line:Foo_Detail_Line_ID,Foo_ID:buFoo_Header:Auth_ID'
  301.  
  302.  
  303. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement