2009-06-05 36 views
15

Tôi cố gắng để sử dụng "VỚI" tuyên bố trong SQL Server 2005. Có vẻ như để làm việc tốt nếu tôi làm điều gì đó như:Nhiều Chọn Báo cáo sử dụng SQL Server 2005 "VỚI" Bản Tuyên Bố

WITH MyBigProducts AS (SELECT * FROM Products WHERE Size='Big') 
SELECT Name FROM MyBigProducts 

Nhưng nó không thành công nếu tôi cố gắng sử dụng nhiều câu lệnh chọn như:

WITH MyBigProducts AS (SELECT * FROM Products WHERE Size='Big') 
SELECT Name FROM MyBigProducts 
SELECT Count(*) FROM MyBigProducts 

và thông báo lỗi là "Tên đối tượng không hợp lệ 'MyBigProducts'".

Có điều gì tôi có thể làm để tăng phạm vi của bảng "MyBigProducts" để bao gồm cả hai câu lệnh chọn không?

Ví dụ của tôi là đơn giản hóa mã thực sự của tôi gây ra sự cố, vì vậy tôi không chiết khấu khả năng ví dụ trên nên hoạt động và có lỗi khác trong SQL của tôi.

Tôi đã thử gói BEGIN và END xung quanh hai câu lệnh SELECT, nhưng trình phân tích cú pháp không thể biên dịch nó.

Trả lời

14

Như Kane đã nói, CTE chỉ có sẵn trong câu lệnh SQL mà nó được viết. Một giải pháp khả thi, tùy thuộc vào chi tiết cụ thể về tình hình của bạn, sẽ bao gồm các COUNT (*) trong truy vấn duy nhất:

;WITH MyBigProducts AS 
(
    SELECT 
      Name, 
      COUNT(*) OVER() AS total_count 
    FROM 
      Products 
    WHERE 
      Size = 'Big' 
) 
SELECT 
    Name, 
    total_count 
FROM 
    MyBigProducts 
+0

này sẽ tính toán số lượng của bảng tổng thể một lần cho mỗi hàng trong bảng Sản phẩm? Hoặc chỉ một lần cho toàn bộ truy vấn? –

+0

Dường như từ kế hoạch truy vấn ở đây nó tính toán nó một lần, sau đó hợp nhất giá trị vô hướng đó vào kết quả. Tôi không biết chi phí tương đối là kết hợp nó vào kết quả (nhưng chỉ phải sử dụng một truy vấn) so với nhận giá trị một lần trong truy vấn thứ hai. Trên một máy chủ như vậy ở đây trả về 5000 hàng, nó không đáng kể. –

14

Tôi tin rằng Biểu thức bảng chung chỉ hợp lệ để sử dụng ngay lập tức, đó là lý do tại sao bạn nhận được lỗi cho "CHỌN Đếm (*) TỪ MyBigProducts". Để sử dụng lại CTE, bạn nên sử dụng bảng tạm thời thay vì

DECALRE @BigProducts TABLE (...[declaration omitted]...) 

INSERT INTO @BigProducts 
SELECT * 
FROM Products 
WHERE Size='Big' 


SELECT Name FROM @BigProducts 
SELECT Count(*) FROM @BigProducts 

Hãy sửa tôi nếu tôi sai.

2

CTE có tuyên bố phạm vi và khả năng hiển thị của địa phương. Nếu bạn muốn có phạm vi và khả năng hiển thị lớn hơn cho một biểu thức bảng, bạn sẽ cần phải biến CTE thành một hàm View hoặc table-valued. Ngoài ra, bạn có thể thực hiện các biểu thức kết quả thành một biến bảng, đó là cục bộ cho lô hiện tại hoặc một bảng tạm thời có thời gian tồn tại cục bộ cho lô hiện tại, nhưng có khả năng hiển thị kéo dài đến toàn bộ phiên. Quay lại đầu trang

-1
WITH n(id, name) AS 
    (SELECT id, name 
    FROM ABC 
    WHERE parent = 44 
     UNION ALL 
    SELECT m.id, m.name 
    FROM ABC as m, n 
    WHERE n.id = m.parent) 
SELECT * FROM n 
+0

Chăm sóc để xây dựng? Câu trả lời cho câu hỏi của tôi không rõ ràng đối với tôi ... –

0
CREATE TABLE tblEmployees 
(
    EmployeeID SMALLINT IDENTITY(1001,1) NOT NULL, 
    EmployeeName NVARCHAR(100) NOT NULL, 
    Department NVARCHAR(50) NOT NULL, 
    Designation NVARCHAR(50) NOT NULL, 
    JoiningDate DATETIME NOT NULL, 
    Salary  DECIMAL(10,2) NOT NULL, 
    [Description] NVARCHAR(1000) NULL 
) 

SELECT * FROM tblEmployees 

INSERT INTO tblEmployees(EmployeeName, Department, Designation, JoiningDate, Salary, [Description]) 
VALUES ('John Smith', 'IT Research', 'Research Analyst', '02/08/2005', 23000.00, 'John Smith is involved in the Research and Development since 2005') 

INSERT INTO tblEmployees(EmployeeName, Department, Designation, JoiningDate, Salary, [Description]) 
VALUES ('John Micheal', 'IT Operations', 'Manager', '07/15/2007', 15000.00, NULL) 

INSERT INTO tblEmployees(EmployeeName, Department, Designation, JoiningDate, Salary, [Description]) 
VALUES ('Will Smith', 'IT Support', 'Manager', '05/20/2006', 13000.00, 'Joined this year as IT Support Manager') 

INSERT INTO tblEmployees(EmployeeName, Department, Designation, JoiningDate, Salary, [Description]) 
VALUES ('Anna John', 'IT Support', 'Developer', '02/10/2008', 23000.00, 'Joined this year as IT Support Developer') 


DECLARE @EmpID AS SMALLINT 
DECLARE @SQLQuery AS NVARCHAR(500) 
SET @EmpID = 1001 
SET @SQLQuery = 'SELECT * FROM tblEmployees WHERE EmployeeID = ' + CAST(@EmpID AS NVARCHAR(10)) 
Print @SQLQuery 
EXECUTE(@SQLQuery) 


DECLARE @EmpID AS SMALLINT 
DECLARE @SQLQuery AS NVARCHAR(500) 
DECLARE @ParameterDefinition AS NVARCHAR(100) 
SET @EmpID = 1002 
SET @SQLQuery = 'SELECT * FROM tblEmployees WHERE EmployeeID = @EmpID' 
SET @ParameterDefinition = '@EmpID SMALLINT' 
EXECUTE sp_executesql @SQLQuery, @ParameterDefinition, @EmpID 



Create Procedure sp_EmployeeSelect 
    @EmployeeName NVarchar(100), 
    @Department NVarchar(50), 
    @Designation NVarchar(50), 
    @StartDate DateTime, 
    @EndDate DateTime, 
    @Salary Decimal(10,2)  
AS 
    Set NoCount ON 
    Declare @SQLQuery AS NVarchar(4000) 
    Declare @ParamDefinition AS NVarchar(2000) 
    Set @SQLQuery = 'Select * From tblEmployees where (1=1) ' 

    If @EmployeeName Is Not Null 
     Set @SQLQuery = @SQLQuery + ' And (EmployeeName = @EmployeeName)' 
    If @Department Is Not Null 
     Set @SQLQuery = @SQLQuery + ' And (Department = @Department)' 
    If @Designation Is Not Null 
     Set @SQLQuery = @SQLQuery + ' And (Designation = @Designation)' 
    If (@StartDate Is Not Null) AND (@EndDate Is Not Null) 
     Set @SQLQuery = @SQLQuery + ' And (JoiningDate BETWEEN @StartDate AND @EndDate)' 
    If @Salary Is Not Null 
     Set @SQLQuery = @SQLQuery + ' And (Salary >= @Salary)' 
    Set @ParamDefinition = '@EmployeeName NVarchar(100), 
       @Department NVarchar(50), 
       @Designation NVarchar(50), 
       @StartDate DateTime, 
       @EndDate DateTime, 
       @Salary Decimal(10,2)' 

    Exec sp_Executesql @SQLQuery, @ParamDefinition, @EmployeeName, @Department, @Designation, 
         @StartDate, @EndDate, @Salary 

    If @@ERROR <> 0 GoTo ErrorHandler 
    Set NoCount OFF 
    Return(0) 

ErrorHandler: 
    Return(@@ERROR) 
GO 


EXEC sp_EmployeeSelect 'John Smith', NULL, NULL, NULL, NULL, NULL 

EXEC sp_EmployeeSelect NULL, 'IT Operations', 'Manager', NULL, NULL, NULL 




DECLARE @EmpName AS NVARCHAR(50) 
DECLARE @SQLQuery AS NVARCHAR(500) 
SET @EmpName = 'John' 
SET @SQLQuery = 'SELECT * FROM tblEmployees WHERE EmployeeName LIKE '''+ '%' + @EmpName + '%' + '''' 
PRINT @SQLQuery 
EXECUTE sp_executesql @SQLQuery 



DECLARE @EmpID AS NVARCHAR(50) 
DECLARE @SQLQuery AS NVARCHAR(500) 
SET @EmpID = '1001,1003,1004,1002' 
SET @SQLQuery = 'SELECT * FROM tblEmployees WHERE EmployeeID IN(' + @EmpID + ')' 
EXECUTE sp_executesql @SQLQuery 


DECLARE @OrderBy AS NVARCHAR(50) 
DECLARE @SQLQuery AS NVARCHAR(500) 
SET @OrderBy = 'Department' 
SET @SQLQuery = 'SELECT * FROM tblEmployees Order By ' + @OrderBy 
EXECUTE sp_executesql @SQLQuery 


WITH RESULTS AS(
SELECT * FROM [dbo].[User] 
)`enter code here` 
Các vấn đề liên quan