2012-04-18 25 views
6

SSIS 2008. Nhiệm vụ rất đơn giản. Tôi muốn lấy một biến hệ thống và sử dụng nó trong một SQL INSERT. Tôi muốn lấy giá trị của System:MachineName và sử dụng nó trong một câu lệnh chèn.Làm cách nào để chuyển giá trị biến hệ thống cho câu lệnh SQL trong thực thi SQL?

Sử dụng câu lệnh INSERT INTO MYLOG (COL1) SELECT @[System::MachineName] cung cấp cho các lỗi Error: ..failed to parse. Must declare the scalar variable "@"

Sử dụng các báo cáo SELECT @System::MachineName hoặc SELECT @@[System::MachineName] cung cấp cho các lỗi 'Error Incorrect systax near '::'

Tôi không cố gắng để vượt qua một tham số để truy vấn. Tôi đã tìm kiếm một ngày rồi nhưng không thể tìm ra cách để làm điều này một cách đơn giản!

Trả lời

14

Đây là một cách bạn có thể thực hiện việc này. Gói mẫu sau được tạo bằng cách sử dụng SSIS 2008 R2 và sử dụng SQL Server 2008 R2 làm chương trình phụ trợ.

  • Tạo một bảng mẫu trong cơ sở dữ liệu SQLServer bạn tên dbo.PackageData

Table structure

  • Tạo một gói SSIS.
  • Trên SSIS, thêm trình quản lý kết nối OLE DB có tên SQLServer để kết nối với cơ sở dữ liệu của bạn, hãy nói đến cơ sở dữ liệu SQL Server.
  • Trên tab Luồng điều khiển, kéo và thả một Execute SQL Task
  • Nhấp đúp vào tác vụ Thực thi SQL để mang đến Trình biên tập tác vụ SQL thực thi.
  • Trên tab General của trình chỉnh sửa, đặt thuộc tính Connection cho trình quản lý kết nối của bạn có tên SQLServer.
  • Trong tài sản SQLStatement, nhập câu lệnh insert INSERT INTO dbo.PackageData (PackageName) VALUES (?)

General tab

  • Trên tab Parameter Mapping, nhấn nút Add, chọn biến trọn gói mà bạn muốn sử dụng. Thay đổi kiểu dữ liệu cho phù hợp. Ví dụ này sẽ chèn PackageName vào một bảng, do đó, Data Type sẽ là VARCHAR. Đặt tên Parameter thành 0, cho biết giá trị chỉ số của tham số. Nhấp vào nút OK.

Parameter Mapping tab

  • Execute gói.
  • Bạn sẽ thấy một bản ghi mới được chèn vào bảng. Tôi giữ lại tên gói là Gói. Đó là lý do tại sao các bảng

Package data

Hy vọng rằng sẽ giúp.

+1

Câu trả lời hoàn hảo và được trình bày rất độc đáo. Tôi đã thử quá trình này trước đây, và nó không bao giờ làm việc. 'Lỗi' của tôi đã được đặt 'BypassPrepare' thành False, sau đó sử dụng 'Parse Query', luôn trả về một thông báo lỗi. Thiết lập 'Bypass Prepare' thành True chính là thủ thuật bí mật. Tôi nghi ngờ nó là một cái gì đó đơn giản và không tài liệu tốt. Cảm ơn Siva rất nhiều! 4 sao và một khuôn mặt cười cho bạn. – mroselius

+0

Tôi vừa học được "dấu hỏi" nghĩa là gì và bây giờ điều này có ý nghĩa. Cảm ơn bạn về giải pháp toàn diện này. Ngoài ra, hình ảnh của bạn bị hỏng, vì vậy tôi đã xóa chúng. Vui lòng thêm lại chúng. – Vippy

1

Tôi chưa bao giờ sử dụng nó trước đây nhưng có thể bạn có thể kiểm tra việc sử dụng biểu thức trong thực thi nhiệm vụ SQL cho điều đó.

Hoặc chỉ cần đặt toàn bộ truy vấn vào một biểu thức của biến có evaluationAsExpression được đặt thành true. Sau đó, sử dụng OLE DB để bạn chèn

+1

+1 Đây là câu trả lời đúng IMHO. Câu hỏi của OP là khá nhiều trường hợp sử dụng cho các biểu thức thuộc tính SSIS. Để chuyển các biến SSIS vào chuỗi truy vấn, người ta sẽ nối nó vào một bộ biểu thức cho thuộc tính 'SqlStatementSource'; '" INSERT INTO MYLOG (COL1) SELECT "+ @ [Hệ thống :: Tên máy]'. Đây không phải là để đề xuất câu trả lời được chấp nhận không phải là một mô hình tốt. – Sepster

1

Mỗi bình luận của tôi chống lại câu trả lời của @ ZERO (lặp lại ở đây như là một câu trả lời để nó không bị bỏ qua bởi những người mới đến SSIS).

Câu hỏi của OP là khá nhiều trường hợp sử dụng cho biểu thức thuộc tính SSIS.

Để vượt qua các biến SSIS vào chuỗi truy vấn người ta sẽ nối nó vào một biểu thức đặt ra cho bất động sản SqlStatementSource:

"INSERT INTO MYLOG (COL1) SELECT " + @[System::MachineName]

này không phải là để gợi ý câu trả lời chấp nhận không phải là một mô hình tốt, như nói chung, cách tiếp cận được tham số hóa là an toàn hơn (chống lại SQL injection) và nhanh hơn (khi sử dụng lại) hơn thao tác chuỗi truy vấn trực tiếp. Nhưng đối với biến hệ thống (trái ngược với chuỗi do người dùng nhập), giải pháp này phải an toàn với SQL injection, và điều này sẽ nhanh hoặc nhanh hơn truy vấn được tham số nếu được sử dụng lại (tên máy không thay đổi).

0

Cùng với câu trả lời @ user756519 của, Tùy thuộc vào chuỗi kết nối của bạn, tên biến và SQLStatementSource Changes

https://docs.microsoft.com/en-us/sql/integration-services/control-flow/execute-sql-task

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