2012-08-16 51 views
44

Tôi có truy vấn tôi cần chạy truy vấn dưới dạng truy vấn động để xuất tên cột có ý nghĩa. Ví dụ, nếu tôi chạy truy vấn trực tiếp, nó sẽ trả về dữ liệu chính xác. Tuy nhiên, nếu tôi sử dụng mã dưới đây, nó cho thấy:exec không thành công vì tên không phải là số nhận dạng hợp lệ?

The name ' 
      SELECT (CASE WHEN A.Domain IS NOT NULL THEN A.Domain ELSE B.Domain END) AS [Domain], 
        (CASE WHEN A.Email IS NOT NULL THEN A.Email ELSE B.Email END) AS [Email], 
        A.[Sender Size] AS [Sender Size 1], A.[Sender Count] AS [Sender Count 1], 
         A.[Receiver Size] AS [Receiver Size 1], A.[Receiver Count] AS [Receiver Count 1], 
        A.[Sender Size 2] AS [Sender Size 2], A.[Sender Count 2] AS [Sender Count 2], 
         A.[Receiver Size 2] AS [Receiver Size 2], A.[Receiver Count 2] AS [Receiver Count 2], 
        B.SenderSize AS [Sender Size Average], B.SenderCount AS [Sender Count Average], 
         B.ReceiverSize AS [Receiv' is not a valid identifier. 

Dưới đây là các mã:

DECLARE @query NVARCHAR(4000) 
SET @query = N'SELECT * 
      FROM 
      (
       SELECT (CASE WHEN A.Domain IS NOT NULL THEN A.Domain ELSE B.Domain END) AS [Domain], 
         (CASE WHEN A.Email IS NOT NULL THEN A.Email ELSE B.Email END) AS [Email], 
         A.[Sender Size] AS [Sender Size 1], A.[Sender Count] AS [Sender Count 1], 
          A.[Receiver Size] AS [Receiver Size 1], A.[Receiver Count] AS [Receiver Count 1], 
         A.[Sender Size 2] AS [Sender Size 2], A.[Sender Count 2] AS [Sender Count 2], 
          A.[Receiver Size 2] AS [Receiver Size 2], A.[Receiver Count 2] AS [Receiver Count 2], 
         B.SenderSize AS [Sender Size Average], B.SenderCount AS [Sender Count Average], 
          B.ReceiverSize AS [Receiver Size Average], B.ReceiverCount AS [Receiver Count Average] 
       FROM 
        (
        SELECT (CASE WHEN tf.Domain IS NOT NULL THEN tf.Domain ELSE tf2.Domain END) AS Domain, 
          (CASE WHEN tf.Email IS NOT NULL THEN tf.Email ELSE tf2.Email END) AS Email, 
         ISNULL(tf.SenderSize,0) AS [Sender Size] , ISNULL(tf.SenderCount,0) AS [Sender Count], ISNULL(tf.ReceiverSize,0) AS [Receiver Size], ISNULL(tf.ReceiverCount,0) AS [Receiver Count], 
         ISNULL(tf2.SenderSize,0) AS [Sender Size 2], ISNULL(tf2.SenderCount,0) AS [Sender Count 2], ISNULL(tf2.ReceiverSize,0) AS [Receiver Size 2], ISNULL(tf2.ReceiverCount,0) AS [Receiver Count 2] 
        FROM #TrafficFinal tf FULL JOIN #TrafficFinal2 tf2 ON (tf.Email = tf2.Email AND tf.Domain = tf2.Domain) 
        ) A FULL JOIN #TrafficFinal3 B ON (A.Email = B.Email AND A.Domain = B.Domain) 
      ) C 
      ORDER BY Domain, Email';  

PRINT @query; 

-- run it 
exec @query; 

Có phải vì của đầy đủ tham gia?

+0

xin lỗi về điều đó. tôi mất một lúc để tìm ra biểu tượng kiểm tra có thể được nhấp vào. – urlreader

Trả lời

155

Hãy thử điều này thay vì cuối cùng:

exec (@query) 

Nếu bạn không có dấu ngoặc, SQL Server giả định giá trị của biến trở thành một tên thủ tục lưu trữ.

HOẶC

EXECUTE sp_executesql @query 

Và nó không phải là vì FULL JOIN.
Nhưng tôi hy vọng bạn đã tạo các bảng tạm thời: #TrafficFinal, # TrafficFinal2, # TrafficFinal3 trước đó.


Xin lưu ý rằng có những cân nhắc về hiệu suất giữa việc sử dụng EXEC và sp_executesql. Bởi vì sp_executesql sử dụng bộ đệm ẩn câu lệnh như là một sp.
Thêm chi tiết here.


Ngày lưu ý khác, là có một lý do tại sao bạn đang sử dụng sql năng động đối với trường hợp này, khi bạn có thể sử dụng các truy vấn như là, xem xét bạn không làm bất kỳ thao tác truy vấn và thực hiện nó theo cách nó là gì?

+1

cảm ơn bạn rất nhiều, tôi biết tôi đã bỏ lỡ một cái gì đó đơn giản! :) – urlreader

+0

đó là vì tiêu đề cột, tức là Số lượng người nhận 1, ..., cần thân thiện với người dùng bằng biến ngày. – urlreader

+1

Tôi chỉ gặp vấn đề tương tự, cảm ơn giải pháp. Tôi cảm thấy ngớ ngẩn không phải vì nó quá đơn giản. – Jackson

0

Như là trong trường hợp của tôi nếu sql của bạn được tạo ra bằng cách kết hợp hoặc sử dụng chuyển đổi sau đó SQL tại thực hiện cần phải được bắt đầu bằng chữ cái N như sau

ví dụ

Exec N'Select bla..' 

chữ N định nghĩa chuỗi là unicode.

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