2015-04-20 10 views
6

Tôi muốn chuyển đổi dữ liệu chuỗi thành mảng trong máy chủ sql. Tôi đã thử nó như dưới đây.Phương thức varchar.toArray() hoặc string.toArray() của máy chủ SQL

SELECT '223456789' AS SerialOriginalCode 
-- SerialOriginalCode 223456789 
DECLARE @tbl_SerialOriginalVerion TABLE(ID INT, SerialOriginalCode INT); 
INSERT INTO @tbl_SerialOriginalVerion VALUES 
(1, 2), 
(2, 2), 
(3, 3), 
(4, 4), 
(5, 5), 
(6, 6), 
(7, 7), 
(8, 8), 
(9, 9); 
SELECT * FROM @tbl_SerialOriginalVerion 

Nhưng đó là cách thủ công, đó không phải là cách hội tụ có lập trình khi cần tôi khóa mỗi giá trị chèn cho mỗi dòng.

Ai đó có thể gợi ý cho tôi một cách lịch thiệp hơn?

+1

tôi sẽ khuyên bạn nên làm điều này ở phía ứng dụng. cơ sở dữ liệu không được tối ưu hóa cho các nhiệm vụ thủ tục đệ quy như vậy. – ughai

+0

Tôi không nghĩ rằng SQL Server hỗ trợ bất kỳ của hai phương pháp: 'varchar.toArray() hoặc string.toArray() method' –

Trả lời

3
DECLARE @InputText AS VARCHAR(MAX) = '223456789' 
DECLARE @Pos Int = 1 
DECLARE @End Int 
DECLARE @TextLength Int = DATALENGTH(@InputText) 

DECLARE @Array TABLE 
(
    TokenID Int PRIMARY KEY IDENTITY(1,1), 
    Match Varchar(MAX) 
) 

-- Exit function if no text is passed in. 
IF @TextLength <> 0 
    BEGIN 
    WHILE @Pos <= @TextLength BEGIN 
     INSERT @Array (Match) VALUES (SUBSTRING(@InputText,@Pos,1)) 
     SET @Pos = @Pos + 1 
    END 
    END 

SELECT * FROM @Array 
1

Hãy thử INSERT này sử dụng number từ master..spt_values

SELECT '223456789' AS SerialOriginalCode 
-- SerialOriginalCode 223456789 
DECLARE @tbl_SerialOriginalVerion TABLE(ID INT, SerialOriginalCode INT); 

INSERT INTO @tbl_SerialOriginalVerion 
SELECT number + 1, SUBSTRING(t.SerialOriginalCode, sv.number + 1, 1) 
FROM (SELECT '223456789' AS SerialOriginalCode) t 
INNER JOIN master..spt_values sv ON sv.number < LEN(t.SerialOriginalCode) 
WHERE sv.[type] = 'P' 


SELECT * FROM @tbl_SerialOriginalVerion 

Output:

ID SerialOriginalCode 
1 2 
2 2 
3 3 
4 4 
5 5 
6 6 
7 7 
8 8 
9 9 
1

tôi sẽ khuyên bạn nên làm điều này trong ứng dụng của bạn. SQL được tối ưu hóa cho các hoạt động dựa trên Đặt và không xử lý các tác vụ thủ tục đệ quy như thế này.

Nếu bạn muốn thực hiện điều này trong SQL, bạn có thể tìm số LEN của chuỗi và sau đó đệ quy tìm ký tự tiếp theo. Một cái gì đó như

Query này

DECLARE @SerialOriginalCode VARCHAR(20) = '223456789' 

DECLARE @tbl_SerialOriginalVerion TABLE(ID INT, SerialOriginalCode INT); 

DECLARE @len INT = LEN(@SerialOriginalCode) 
;WITH CTE as 
(
SELECT 1 as ID,CONVERT(INT,SUBSTRING(@SerialOriginalCode,1,1)) as CharInt 
UNION ALL 
SELECT ID + 1,CONVERT(INT,SUBSTRING(@SerialOriginalCode,ID + 1,1)) 
FROM CTE WHERE LEN(@SerialOriginalCode) >= ID + 1 
) 
INSERT INTO @tbl_SerialOriginalVerion(ID,SerialOriginalCode) 
SELECT * FROM CTE; 

SELECT * FROM @tbl_SerialOriginalVerion 

Output

ID SerialOriginalCode 
1 2 
2 2 
3 3 
4 4 
5 5 
6 6 
7 7 
8 8 
9 9 
+0

Cảm ơn sự giúp đỡ của bạn @ughai. Sẽ hữu ích hơn nếu bạn có thể gửi chức năng tùy chỉnh của mình "TRY_CONVERT" –

+1

Sử dụng 'CONVERT' thay cho' TRY_CONVERT' nếu bạn đang sử dụng bất kỳ phiên bản nào trước SQL Server 2014 – ughai

+0

Cảm ơn bạn @ughai vì sự giúp đỡ liên tục của bạn –

1

Với CTE và Áp dụng:

Declare @s nvarchar(9) = '223456789' 

;with cte as(
select n from (values(1),(2),(3),(4),(5),(6),(7),(8),(9)) as t(n)) 
select * from cte 
cross apply(select substring(@s, cte.n, 1) as c) ca 

Output:

n c 
1 2 
2 2 
3 3 
4 4 
5 5 
6 6 
7 7 
8 8 
9 9 

Hoặc bạn có thể làm điều đó với các bảng tổng sắp:

declare @s varchar(100) = '223456789' 

;with t as(select row_number() over(order by (select null)) rn from 
      (values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) t1(n) cross join 
      (values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) t2(n)) 
select substring(@s, rn, 1) from t 
where rn <= len(@s) 

Fiddle http://sqlfiddle.com/#!3/9eecb7db59d16c80417c72d1/570

+1

nó sẽ chỉ dành cho làm việc cho chuỗi với 9 ký tự chính xác – ughai

+0

9 ký tự chính xác đó đủ cho nguyên nhân của tôi @ughai. –

Các vấn đề liên quan