2012-12-12 27 views
28

Tôi đang gặp rắc rối với truy vấn này:Sử dụng một biến trong OPENROWSET Query

SELECT * 
FROM OPENROWSET(
    'SQLNCLI', 
    'DRIVER={SQL Server};', 
    'EXEC dbo.sProc1 @ID = ' + @id 
) 

Cung cấp cho một lỗi:

Incorrect syntax near '+'.

Bất cứ ai cũng biết tại sao tôi nhận được lỗi này?

Trả lời

34

Theo đề nghị của Scott, bạn không thể sử dụng biểu thức trong OPENROWSET .Try tạo sql động để vượt qua các thông số

Declare @ID int 
Declare @sql nvarchar(max) 
Set @ID=1 
Set @sql='SELECT * 
FROM OPENROWSET(
       ''SQLNCLI'', 
       ''DRIVER={SQL Server};'', 
       ''EXEC dbo.usp_SO @ID =' + convert(varchar(10),@ID) + ''')' 

-- Print @sql 
Exec(@sql) 
9

OPENROWSET yêu cầu chuỗi ký tự, chứ không phải biểu thức. Đó là phàn nàn về dấu cộng, vì nó không mong đợi bất cứ điều gì nhiều hơn một chuỗi chữ và bạn follewed chuỗi chữ với một nhà điều hành.

Xem http://msdn.microsoft.com/en-us/library/ms190312.aspx trong đó nêu:

'query'

Is a string constant sent to and executed by the provider...

+0

Cảm ơn Scott, tôi nghĩ rằng msg lỗi tôi đã nhận được đã cho tôi ý tưởng đó. –

0

Đối với những gì nó có giá trị. Lý do chúng tôi sử dụng openrowset thay vì truy vấn máy chủ được liên kết thẳng là việc xử lý truy vấn máy chủ được liên kết xảy ra trên máy chủ cục bộ. (Chậm và thường mang lại hầu hết các bàn)

Có, chúng tôi có thể thực hiện việc ghép chuỗi như trên.

Một tùy chọn khác mà bạn có cú pháp dễ dàng và sức mạnh của thông số.

Tạo một proc được lưu trữ trên hộp điều khiển từ xa, proc đó có tất cả các tham số bạn cần. Gọi cho proc được lưu trữ từ một truy vấn máy chủ được liên kết chuẩn (giống như perf hoặc tốt hơn so với các linh hồn trên và dễ dàng hơn để mã hóa với.

ví dụ: linkedservername.database.dbo.myproc 123, 'abc', 'someparam', getdate()

Chỉ cần một tùy chọn ....

+1

câu trả lời này có thể là tốt hơn nếu nó giải thích nó như thế nào giải quyết vấn đề – FistOfFury

3
Declare @Route VARCHAR(200) 
Declare @sql nvarchar(max) 
Set @Route='C:\OCRevisiones.xlsx;' 
Set @sql='SELECT * INTO FFFF 
FROM OPENROWSET(
       ''Microsoft.ACE.OLEDB.12.0'', 
       ''Excel 12.0;HDR=YES;Database=' + @Route + ''', 
       ''SELECT * FROM [Sheet1$]'')' 

Print @sql 
--Exec(@sql) 
+5

Xin chào và chào mừng bạn đến với StackOverflow. Vui lòng không đăng câu trả lời chỉ có mã, nhưng hãy đưa ra giải thích. ecially cho một câu hỏi như thế này, nơi mà câu hỏi là "tại sao điều này không làm việc?" và không "những gì khác sẽ làm việc?" – Banana

+3

Trong khi nói chung tôi đồng ý rằng bài viết nên có một số lời giải thích, không có nhiều giải thích cần thiết câu hỏi đã được trả lời vào tháng 12 năm 2012. Tôi thấy câu trả lời này hữu ích ở chỗ nó hiển thị các giá trị đối số để kết nối với một tệp Excel (đối số cơ sở dữ liệu) và trang $ làm cơ sở dữ liệu và bảng SQL Server. – RyanB

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