2011-02-23 36 views
0
Departmentid parentid 
2   52630  
8   52630  
14   52630  
20   52630  
26   52630 

declare @retstr varchar(8000) 
Select Top 5 @retstr = COALESCE(@retstr + ',','') +''''+ 
    convert  (varchar,departmentid) 
    +'''' 
     from Department where ParentId =52630 
print @retstr 

我得到以下結果幫我解決SQL Server 2008中的字符串的條件?

輸出: '2', '8', '14', '20', '26'

@retstr有 '2', '8', '14', '20', '26' 值,並使用運營商i的檢查車況

Select * from product 
     INNER JOIN [DepartmentProduct] dp ON p.productid=dp.productid 
     INNER JOIN [Department] d ON d.DepartmentId = dp.DepartmentId 
     INNER JOIN [ProductTranslation] pt ON p.ProductId = pt.ProductId AND pt.LocaleId = 1    
    WHERE **d.department in (@retstr)** 

它拋出以下錯誤:

Error converting data type nvarchar to bigint.

回答

1

你是補償在你的第二個查詢中使用bigint作爲字符串。你想要做的是使用子查詢,而不是將其保存爲字符串。

select * 
     from product 
INNER JOIN [DepartmentProduct] dp ON p.productid=dp.productid 
INNER JOIN [Department] d ON d.DepartmentId = dp.DepartmentId 
INNER JOIN [ProductTranslation] pt ON p.ProductId = pt.ProductId AND pt.LocaleId = 1 
    WHERE d.department in (Select Top 5 departmentid 
           from Department where ParentId =52630) 
0

@retstr是VARCHAR,那麼您的查詢實際上是

WHERE d.department在('' '2' ' '' 8 '' ...'

IN列表應該是單獨的int/bigints,而不是一個僞裝成列表的單個字符串。順便說一下,SQL Server不支持數組/列表類型。

你需要做的僅僅是使第一查詢第二

Select * 
from product 
INNER JOIN [DepartmentProduct] dp ON p.productid=dp.productid 
INNER JOIN [Department] d ON d.DepartmentId = dp.DepartmentId 
INNER JOIN [ProductTranslation] pt ON p.ProductId = pt.ProductId AND pt.LocaleId = 1 
WHERE d.department in (
    Select Top 5 departmentid 
    from Department 
    where ParentId =52630 
) 
0

的原因錯誤是IN操作期待值相同類型d.department列表的子查詢,即整數列表。 @restr

您可以將其重寫爲一個查詢,如其他答案中所述,我會推薦。如果你需要把它作爲單獨的查詢,可以使用動態SQL:

@sql = 'Select * from product INNER JOIN [DepartmentProduct] dp ON p.productid=dp.productid INNER JOIN [Department] d ON d.DepartmentId = dp.DepartmentId INNER JOIN [ProductTranslation] pt ON p.ProductId = pt.ProductId AND pt.LocaleId = 1 WHERE d.department in ('[email protected]+')' 

然後,您可以使用ExecSQL(@sql)來執行查詢。