2016-08-24 54 views
3

我有,當我試圖在SQL Server中執行sp_executesql的2014 有我的存儲過程這個問題:SQL SERVER sp_executesql的不正確的語法附近「)」

alter proc search 
@Name nvarchar 
as 
declare @SQL nvarchar 
declare @Params nvarchar 
begin 
    set @SQL = N' Select * from Table_1 , Table_2 where (1=1) ' 

    if @Name is not null 
     begin 
     set @SQL = @SQL + ' and Table_2.thatoneID = (Select Table_1.Id from Table_1 where Table_1.Name like ''%''[email protected]+''%'') ' 
     end 
    set @SQL = @SQL + ' and Table_2.thatoneID = Table_1.Id ; ' 

    set @Params = '@Name nvarchar' 

    execute sp_executesql @SQL , @Params , @Name 
end 

當我想:

Execute search 'hh' 

我得到這個錯誤

Msg 102, Level 15, State 1, Line 29 Incorrect syntax near ')'. 
+5

你應該總是指定變量的長度,所以'爲nvarchar(100)'否則它只會默認爲1個字符 –

+0

另外,使用unicode文本時,請使用unicode文字('N'%'')。雖然在這種情況下,你不打算使用任何索引:D – Luaan

+0

爲什麼動態SQL?爲什麼舊式加入?保持你的SP簡單。 – gofr1

回答

2

你應該總是指定長度Ø f變量,所以nvarchar(100),否則它只會默認爲1個字符。

只是測試你的變量都保存什麼用它們打印:

print @sql 
print @params 

由於沒有長度的設置,打印的唯一的事情就是

@ 

爲什麼只有「@」,而不是「S」來自SELECT關鍵字,爲@sql變量?因爲你在@sql變量的開頭有一個空格。

與之相對的每一個變量設置尺寸時,(我只是去,最大,因爲我不知道你真正需要什麼長度)來:

declare @SQL nvarchar(max) 
    , @Name nvarchar(max) 
declare @Params nvarchar(max) 
begin 
    set @SQL = N' Select * from Table_1 , Table_2 where (1=1) ' 

    if @Name is not null 
     begin 
     set @SQL = @SQL + ' and Table_2.thatoneID = (Select Table_1.Id from Table_1 where Table_1.Name like ''%''[email protected]+''%'') ' 
     end 
    set @SQL = @SQL + ' and Table_2.thatoneID = Table_1.Id ; ' 

    set @Params = '@Name nvarchar' 

    print @sql 
    print @params 

end 

,這將給你:

Select * from Table_1 , Table_2 where (1=1) and Table_2.thatoneID = Table_1.Id ; 
@Name nvarchar 

我建議你先試試看看你是否仍然有錯誤。

+0

謝謝解決我的問題,但我得到另一個消息512,級別16,狀態1,行32 子查詢返回多個值。當子查詢遵循=,!=,<, <= , >,> =或當子查詢用作表達式時,這是不允許的。 –

+0

@ mohammad.pro那麼,那應該意味着你創建了另一個問題。保持獨特。 –

+0

這是工作人員謝謝!^ _ ^,第二個問題是'='「子查詢」它應該是'在'而不是相等 –

1

起初 - 請使用table aliases

二,重寫您的查詢,您正在使用old ANSI style

第三 - 定義nvarchar大小。

第四 - 爲什麼你甚至使用動態SQL?

ALTER PROC search 
    @Name nvarchar(max) 
AS 

SELECT * 
FROM Table_1 t1 
INNER JOIN Table_2 t2 
    ON t2.thatoneID = t1.Id 
WHERE (1=1) AND t1.Name LIKE '%'[email protected]+'%' 

如果您在使用動態SQL堅持,你可以使用這個:

ALTER PROC search 
    @Name nvarchar(max) 
AS 
DECLARE @SQL nvarchar(max), 
     @Params nvarchar(max) 

SELECT @SQL = N' 
SELECT * 
FROM Table_1 t1 
INNER JOIN Table_2 t2 
    ON t2.thatoneID = t1.Id 
WHERE (1=1) AND t1.Name LIKE ''%''[email protected]+''%''' 

PRINT @sql 
SET @Params = '@Name nvarchar(max)' 

EXEC sp_executesql @SQL, @Params, @Name = @Name 
+0

我的問題已修復,但爲什麼我使用動態Sql,因爲我沒有找到另一種方式來做不同的搜索(上面的例子)只是一個測試,因爲真正的測試是這樣的 –

+0

它說它太長以至於無法發表評論 –

+0

無論如何,考慮簡化您的查詢,就像現在一樣 - 它很混亂。 – gofr1

相關問題