2011-11-18 50 views
2

使用SQL Server 2000多張值不插入

我想根據部門

ID Department 
001 H001 
002 F001 
003 S001 
004 D001 

存儲過程

ALTER PROC [dbo].[proc_Atnd1] 
@Dep VARCHAR(100) 
AS 
BEGIN 
DECLARE @SQL VARCHAR(1000) 
DECLARE @Flag INT 
SELECT @Flag=0 
SELECT @SQL = 'SELECT ID FROM Table1 WHERE ' 
IF @Dep <>'All' 
BEGIN 
IF @Flag=1 
BEGIN 
SELECT @SQL = @SQL+' AND (DEPARTMENT IN ('''[email protected]+'''))' 
END 
ELSE 
BEGIN 
SELECT @SQL = @SQL+' (DEPARTMENT IN ('''[email protected]+'''))' 
SELECT @Flag=1 
END 
END 
if @SQL = 'SELECT ID FROM Table1 WHERE ' SELECT @SQL = 'SELECT ID FROM Table1' 
Delete from tb_Sample 
INSERT INTO tb_Sample EXEC(@SQL) 
end 

此存儲過程正在爲個人或選擇ID所有部門,但它不適用於多個部門。

  • 如果我傳遞值存儲過程All手段,它顯示所有的ID該部門
  • 如果我選擇H001手段,它是爲H001部門顯示的ID。
  • 如果我選擇H001D001表示沒有任何顯示。

我將多個部門的值如H001,D001,F001傳遞給存儲過程。但是存儲過程沒有爲所選部門插入一個ID

我的存儲過程有什麼問題?

需要存儲過程的幫助

回答

1

首先,我不建議建立動態SQL語句是這樣的...它可以使你容易受到SQL注入式攻擊。如果您必須傳遞一個逗號分隔列表的字符串,我將通過該列表解析並將每個單獨的值插入臨時表中。從那裏你可以加入臨時表而不是使用IN聲明。

然而,這裏的問題是,你與周圍的報價逗號分隔的列表,所以不是尋找值H001D001F001 ...它尋找到'H001', 'D001', 'F001'

等於一個值

要解決您的問題,你會改變你的SELECT語句:

SELECT @SQL = @SQL+' (DEPARTMENT IN ('[email protected]+'))' 

而當你在逗號分隔的列表傳球,在T內部引號包裹每個單獨的值他字符串是這樣的:

編輯:從變量賦值改變爲存儲過程調用,使其更清楚我在暗示什麼。

exec dbo.proc_Atnd1 '''H001'', ''D001'', ''F001''' 

東西解決這些類型的問題時顯示有用的是PRINT的是,你所創建的SQL,然後檢查,並確保它是做你的期望。

但是,我建議您不要採取這種方法,而是考慮解析列表並避免動態SQL。

+0

謝謝您的回覆,我將使用逗號,而不是雙引號或空格。現在我修改我的問題。 – Gopal

+0

你需要用雙引號包裹每個值......'''' –

0

將您的值傳遞給多個部門,使用單引號而不是雙引號。例如:

EXEC [dbo].[proc_Atnd1] 'H001'', ''D001'', ''F001' 
+0

我發現你已經稍微改變了這個問題。如果您選擇另一個答案,我會抽出這個答案(Michael對SQL注入的建議很好)。我也看不到你的@Flag變量是如何被使用的,如果這個東西不包含循環或者把它作爲參數。 –