2011-11-20 112 views
1

所有存儲過程錯誤查詢

USE [amozeshgah] 
GO 
/****** Object: StoredProcedure [dbo].[selectmanageregistercourse] ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER PROCEDURE [dbo].[selectmanageregistercourse] 
@iddore int, 
@stateregister int, 
@userid nvarchar(350) 
AS 
declare @str nvarchar(900) 
BEGIN 
SET @str= 'SELECT tblUserRegisterDore.id, tblUserRegisterDore.idcourse, tblUserRegisterDore.iddore, tblUserRegisterDore.userid, tblUserRegisterDore.coderegister, tblUserRegisterDore.fish, tblUserRegisterDore.date, tblUserRegisterDore.statefish, tblUserRegisterDore.stateregister, tbluser.name, tbldore.name AS namesubcourse, tblmozedore.name AS namecourse, tbluser.family FROM tblUserRegisterDore INNER JOIN tblmozedore ON tblUserRegisterDore.idcourse = tblmozedore.id INNER JOIN tbldore ON tblUserRegisterDore.iddore = tbldore.id AND tblmozedore.id = tbldore.idmozedore INNER JOIN tbluser ON tblUserRegisterDore.userid = tbluser.userid where iddore='+convert(nvarchar(100),@iddore) 
if (@stateregister<>-1) 
begin 
set @str +=' and stateregister='+ convert(varchar(100),@stateregister) 
end 
if (@userid <>'-1') 
begin 
set @str +=' and tblUserRegisterDore.userid='+ @userid 
end 
EXEC sp_executesql @str 
END 

在錯誤 '無效列名稱值@user的id' 所傳遞

參數運行查詢vlaue @userid時

EXEC @return_value = [dbo].[selectmanageregistercourse] 
     @iddore = 3, 
     @stateregister = 1, 
     @userid = N'fdfsdf' 

錯誤 消息207,級別16,狀態1,行1 無效的列名稱'fdfsdf'。

爲什麼?

+0

你展示什麼是傳遞到過程?我認爲問題出在輸入值上。 – bperreault

回答

1

這裏有很多問題,看起來你顯示的文件不是你在服務器上使用的文件。

下面是如何創建SP,而不是使用動態SQL - 這將是更快和更容易使用:

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER PROCEDURE [dbo].[selectmanageregistercourse] 
@iddore int, 
@stateregister int, 
@fish nvarchar(350) 
AS 
BEGIN 
    SELECT tblUserRegisterDore.id, tblUserRegisterDore.idcourse, tblUserRegisterDore.iddore, 
      tblUserRegisterDore.userid, tblUserRegisterDore.coderegister, tblUserRegisterDore.fish, tblUserRegisterDore.date, 
      tblUserRegisterDore.statefish, tblUserRegisterDore.stateregister, tbluser.name, tbldore.name AS namesubcourse, 
      tblmozedore.name AS namecourse, tbluser.family 
    FROM tblUserRegisterDore 
    INNER JOIN tblmozedore ON tblUserRegisterDore.idcourse = tblmozedore.id 
    INNER JOIN tbldore ON tblUserRegisterDore.iddore = tbldore.id AND tblmozedore.id = tbldore.idmozedore 
    INNER JOIN tbluser ON tblUserRegisterDore.userid = tbluser.userid 
    WHERE [email protected] 
    AND ((@stateregister =-1) OR ([email protected])) 
    AND ((@fish ='-1') OR ([email protected])) 
END 

,如果你使用上面

此前評論不再適用

但是,這裏有一個問題。你有一個varchar,你不會在你正在創建的動態sql中使用引號。

set @str +=' and tblUserRegisterDore.fish='+ @fish 

應該

set @str +=' and tblUserRegisterDore.fish='''+ @fish + '''' 
+0

感謝您的幫助 – user1045472

+0

好聽的報價。我還要補充一點,在這種情況下,在'set @str + = N'和tblUserRegisterDore.fish ='''+ ...之前用'N'預先設置字符串常量可能會更安全。 –