2013-04-10 21 views
5

Trong SQL Server 2008, tôi có là truy vấnSQL Server qua biến thay vì mã hóa tên phần tử gốc cứng

DECLARE @root AS varchar(20); 
SET @root = 'Root'; 

DECLARE @element AS varchar(20); 
SET @element = 'Element'; 

SELECT 
    * 
FROM 
    SomeTable 
FOR XML PATH (@element), ROOT(@root); 

Những gì tôi muốn là phải vượt qua một biến thay vì cứng mã hóa tên của phần tử lặp lại và nguồn gốc.

Khi tôi thực hiện truy vấn, nó throws lỗi này:

Msg 102, Level 15, State 1, Line 11 
Incorrect syntax near '@element'. 

Có thể?

Cảm ơn

Trả lời

3

Hãy thử động SQL -

DECLARE 
    @Root VARCHAR(20) 
, @Element VARCHAR(20) 
, @SQL NVARCHAR(500) 

SELECT 
    @Root = 'Root' 
, @Element = 'Element' 
, @SQL = N' 
SELECT * 
FROM Labour.Absence a 
FOR XML PATH (''' + @Element + '''), ROOT(''' + @Root + ''')' 

PRINT @SQL 

EXEC sp_executesql @SQL 
+0

Có cách nào khác không? – user2250447

+0

Không may là cú pháp t-sql không cho phép chỉ định các biến bên trong cấu trúc này. Vì vậy, SQL symanic là cách duy nhất cho tình huống này. – Devart

3

Nó có giá trị học tập để đọc tài liệu cho SQL Server. Nếu bạn nhìn vào FOR clause bạn sẽ thấy:

| PATH [ ('ElementName') ] 
... 
[ , ROOT [ ('RootName') ] ] 

Nếu bạn so sánh điều này với các tài liệu khác, ở đây tôi sẽ sử dụng như là một ví dụ BACKUP:

{ 'physical_device_name' | @physical_device_name_var } 
... 
FILE = { logical_file_name | @logical_file_name_var } 
| FILEGROUP = { logical_filegroup_name | @logical_filegroup_name_var } 

Đó là, khi đó là hợp lệ để chỉ chuyển một chuỗi, chúng sẽ chỉ hiển thị giá trị được phân tách '' trong sơ đồ cú pháp. Khi có thể vượt qua biến số , chúng sẽ hiển thị rõ ràng tùy chọn đó (với tên @). Và khi bạn phải cung cấp một tên chứ không phải là một chuỗi , họ sẽ thể hiện điều đó mà không '' dấu

Vì vậy, như @Devart nói, khả năng duy nhất là sử dụng SQL động.

+0

Tôi không quan tâm đến câu trả lời này. Tôi không cần tài liệu cho tài liệu của mình. – Tony

+1

@Tony - ví dụ: sách giáo khoa sẽ có một phần hướng tới bắt đầu có nhãn "làm thế nào để đọc tài liệu này" thảo luận về các quy ước đánh máy được sử dụng trong suốt phần còn lại của cuốn sách. Tất nhiên, hầu hết thời gian là an toàn để bỏ qua nó và bạn sẽ có thể làm việc nó ra. Tôi đã viết câu trả lời này bởi vì tôi không thể (vào thời điểm đó) tìm thấy một phần tương tự như BOL, nhưng đó là những gì thực sự cần thiết ở đây - bạn cần hiểu các quy ước đánh máy của bất kỳ tài liệu nào để hiểu đầy đủ về nó. –

+0

@Damen_The_Unbeliever Tôi hiểu sự cần thiết và tầm quan trọng của việc hiểu cú pháp tài liệu, nhưng bạn dường như thực hiện một bước nhảy vọt kỳ diệu từ ví dụ này sang ví dụ khác. Tôi đã đến câu hỏi này bởi vì tôi muốn có thể bao gồm một tem datetime trong biến ROOT. Tôi sẽ không đoán nó không được phép. Ngay cả concats cũng không được phép; tức là ROOT ('Hi' + 'there') – Tony

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