Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

SQL Server 2008:nhập danh sách được phân tách bằng dấu phẩy?

Tôi biết điều này không trả lời được câu hỏi thực tế, nhưng tất cả các giải pháp tôi đã thấy để xử lý điều này đều cảm thấy giống như một cuộc tấn công bẩn thỉu để vượt qua những hạn chế trước đây là không thể chuyển nhiều giá trị cho một thủ tục. Kể từ khi giới thiệu các tham số có giá trị bảng trong sql-server 2008, tôi không thấy lý do gì tại sao lại cần một chuỗi phân tách trong SQL:

Bước đầu tiên là tạo kiểu của bạn để chứa các giá trị (tôi có xu hướng sử dụng các tên chung để chúng có thể được sử dụng lại):

CREATE TYPE dbo.StringList AS TABLE (Value NVARCHAR(MAX));

Sau đó, tạo thủ tục của bạn:

CREATE PROCEDURE dbo.GetFromTable @OrgList dbo.StringList READONLY
AS
    SELECT  Something
    FROM    MyTable
    WHERE   Org + '-' + OrgSub IN (SELECT Value FROM @OrgList);

GO

Sau đó, bạn có thể gọi thủ tục của mình như sau

DECLARE @OrgList dbo.StringList;
INSERT @OrgList VALUES 
    ('2342342', '________', 'A'),
    ('5435354', '________', 'B');

EXECUTE dbo.GetFromTable @OrgList;

SQL Fiddle

Điều này thậm chí sẽ tạo cơ hội để tạo một bảng thích hợp hơn:

CREATE TYPE dbo.OrgList AS TABLE(Org VARCHAR(10), OrgSub VARCHAR(10));

CREATE PROCEDURE dbo.GetFromTable @OrgList dbo.OrgList READONLY
AS
    SELECT  Something
    FROM    MyTable
    WHERE   EXISTS
            (   SELECT  1
                FROM    @OrgList O
                WHERE   MyTable.Org = o.Org
                AND     MyTable.OrgSub = o.OrgSub
            );

GO

Sau đó để thực thi

DECLARE @OrgList dbo.OrgList;
INSERT @OrgList VALUES 
    ('2342342', '________'),
    ('5435354', '________');

EXECUTE dbo.GetFromTable @OrgList;

SQL Fiddle

Nếu thực sự cần thiết để chuyển một danh sách được phân tách bằng dấu phẩy, bạn có thể chuyển đổi nó thành Loại StringList bằng cách sử dụng chuyển đổi XML và sử dụng quy trình tương tự, nhưng sử dụng tham số có giá trị bảng cho phép linh hoạt hơn nhiều so với việc sử dụng một chuỗi được phân tách:

DECLARE @S VARCHAR(MAX) = '2342342-________,5435354-________,_______-________';

DECLARE @OrgList dbo.StringList;
INSERT @OrgList
SELECT  Y.value('.', 'NVARCHAR(MAX)')
FROM    (SELECT [X] = CAST(('<X>' + REPLACE(@S, ',' ,'</X><X>')+'</X>') AS XML)) X
        CROSS APPLY X.nodes('X') AS y (Y)

EXECUTE GetFromTable @OrgList

SQL Fiddle



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Không thể sử dụng trong toán tử PIVOT vì nó không bất biến đối với NULL

  2. SQL Server - Làm cách nào để cấp quyền truy cập đã đọc cho TẤT CẢ cơ sở dữ liệu để đăng nhập?

  3. Gửi email từ một trình kích hoạt trong SQL Server (T-SQL)

  4. Tạo thông báo lỗi tùy chỉnh trong kiểm tra ràng buộc trong SQL SERVER 2008

  5. Chọn 10 bản ghi hàng đầu cho mỗi danh mục