Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
| vendors:microsoft:sql [2024/08/23 12:21] – [What do you do when SQL Server is unusually slow?] gerardorourke | vendors:microsoft:sql [2026/04/28 14:24] (current) – [Column types] gerardorourke | ||
|---|---|---|---|
| Line 291: | Line 291: | ||
| Check the Attributes " | Check the Attributes " | ||
| + | |||
| + | ===== Parsing a string with a separator ===== | ||
| + | |||
| + | < | ||
| + | ID PV1 PV2 | ||
| + | 1 boo | ||
| + | 2 blah | ||
| + | 3 bop | ||
| + | 4 banana | ||
| + | 5 a | ||
| + | 6 b | ||
| + | </ | ||
| + | |||
| + | Using String_Split - seems the easiest way to do this - but you need a uniue ID / Primary Key - which you can group off. | ||
| + | |||
| + | <code sql> | ||
| + | WITH SplitData AS ( | ||
| + | SELECT | ||
| + | ID, | ||
| + | PV2, | ||
| + | value AS PartValue, | ||
| + | ROW_NUMBER() OVER (PARTITION BY ID ORDER BY (SELECT NULL)) AS PartNumber | ||
| + | FROM RCD | ||
| + | CROSS APPLY STRING_SPLIT(PV2, | ||
| + | WHERE PV2 like ' | ||
| + | ) | ||
| + | SELECT | ||
| + | ID, | ||
| + | PV2, | ||
| + | MAX(CASE WHEN PartNumber = 1 THEN PartValue END) AS Part1, | ||
| + | MAX(CASE WHEN PartNumber = 2 THEN PartValue END) AS Part2, | ||
| + | MAX(CASE WHEN PartNumber = 3 THEN PartValue END) AS Part3, | ||
| + | MAX(CASE WHEN PartNumber = 4 THEN PartValue END) AS Part4, | ||
| + | MAX(CASE WHEN PartNumber = 5 THEN PartValue END) AS Part5, | ||
| + | MAX(CASE WHEN PartNumber = 6 THEN PartValue END) AS Part6, | ||
| + | MAX(CASE WHEN PartNumber = 7 THEN PartValue END) AS Part7, | ||
| + | MAX(CASE WHEN PartNumber = 8 THEN PartValue END) AS Part8, | ||
| + | MAX(CASE WHEN PartNumber = 9 THEN PartValue END) AS Part9, | ||
| + | MAX(CASE WHEN PartNumber = 10 THEN PartValue END) AS Part10 | ||
| + | FROM SplitData | ||
| + | GROUP BY ID, PV2 | ||
| + | ORDER BY ID;` | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | ID PV2 Part1 Part2 Part3 Part4 Part5 Part6 Part7 Part8 Part9 Part10 | ||
| + | 1 MFA|1|boo|5: | ||
| + | 2 MFA|2|boo|6: | ||
| + | 3 MFA|3|boo|7: | ||
| + | </ | ||
| + | |||
| + | |||
| + | An alternative approach is to use the PARSENAME function. | ||
| + | However this allows only up to 4 fields. So we would need to use different seperators - which becomes very messy. | ||
| + | |||
| + | Why only 4? | ||
| + | Because, PARSENAME (Transact-SQL) Returns the specified part of an object name. | ||
| + | The parts of an object that can be retrieved are the object name, owner name, database name, and server name. | ||
| + | example: SELECT PARSENAME(' | ||
| + | |||
| + | <code sql> | ||
| + | SELECT | ||
| + | ID | ||
| + | ,PV2 | ||
| + | ,LEFT(PV2, CHARINDEX(':', | ||
| + | , | ||
| + | , | ||
| + | , | ||
| + | , | ||
| + | FROM RCD | ||
| + | Where PV2 like ' | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | ID PV2 Part1 MFA1 MFA2 MFA3 MFA4 | ||
| + | 1 MFA|1|boo|5: | ||
| + | 2 MFA|2|boo|6: | ||
| + | 3 MFA|3|boo|7: | ||
| + | </ | ||
| + | |||
| + | ==== Get SQL Column Data TYPE ==== | ||
| + | |||
| + | <code sql> | ||
| + | SELECT | ||
| + | COLUMN_NAME, | ||
| + | DATA_TYPE, | ||
| + | CHARACTER_MAXIMUM_LENGTH | ||
| + | FROM INFORMATION_SCHEMA.COLUMNS | ||
| + | WHERE TABLE_NAME = ' | ||
| + | </ | ||
| + | |||
| + | ==== Check if Column is a primary Key==== | ||
| + | |||
| + | <code sql> | ||
| + | SELECT | ||
| + | kcu.COLUMN_NAME | ||
| + | FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc | ||
| + | JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu | ||
| + | ON tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME | ||
| + | WHERE tc.TABLE_NAME = ' | ||
| + | AND tc.CONSTRAINT_TYPE = ' | ||
| + | AND kcu.COLUMN_NAME = ' | ||
| + | </ | ||