SQL SERVER sp_executesql'''附近的语法不正确

时间:2016-08-24 08:04:29

标签: sql-server stored-procedures sp-executesql

当我尝试在sql server 2014中执行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 ''%''+@Name+''%'' ) '
        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 ')'.

2 个答案:

答案 0 :(得分:2)

你应该总是指定变量的长度,所以nvarchar(100)否则它将默认为1个字符。

只需通过打印来测试变量的存储内容:

print @sql
print @params

没有设置长度,唯一打印的是

@

为什么只有“{”而不是SELECT关键字中的“S”代表@sql变量?因为@sql变量的开头有一个空格。

与为每个变量设置大小相反(我只是使用max,因为我不知道你实际需要的长度):

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 ''%''+@Name+''%'' ) '
        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

我建议您先尝试一下,看看是否仍然出现错误。

答案 1 :(得分:1)

首先 - 请使用table aliases

其次,重写您的查询,您正在使用old ANSI style

第三 - 定义nvarchar尺寸。

Forth - 为什么你甚至使用动态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 '%'+@Name+'%'

如果您坚持使用动态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 ''%''+@Name+''%'''

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

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