Sql server SQL SERVER sp_executesql靠近“')的语法不正确

Sql server SQL SERVER sp_executesql靠近“')的语法不正确,sql-server,stored-procedures,sp-executesql,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

我在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 ')'.

您应该始终指定变量的长度,以便nvarchar100默认为1个字符

只需通过打印来测试您的变量存储了什么:

print @sql
print @params
没有长度设置,唯一打印的是

@
为什么对@sql变量只使用@而不使用SELECT关键字中的S?因为@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
我建议您先尝试一下,看看是否仍然会出现错误。

首先-请使用

第二,重写您正在使用的查询

第三,定义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 '%'+@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

您应该始终指定变量的长度,以便nvarchar100,否则它将默认为1个字符。此外,在使用unicode文本时,请使用unicode文本N“%”。尽管在本例中,您无论如何都不会使用任何索引:DWhy dynamic SQL?为什么要加入旧式?保持您的SP简单。感谢您修复了我的问题,但我得到了另一个问题Msg 512,级别16,状态1,第32行子查询返回了多个值。当子查询在=、!=、=或者,当子查询用作表达式时。@mohammad.pro那么,这应该意味着您创建了另一个问题。把事情弄清楚,这是工人的事,谢谢,第二个问题是“=”子查询它应该是“in”而不是“equalmy”的问题已经解决了,但是关于我为什么使用动态Sql的问题已经解决了,因为我没有找到另一种方法来使用不同的值进行搜索,上面的示例只是一个测试,真正的问题是它说它太长了,无法放入注释,考虑一下简化你的查询,就目前而言,它是一团糟。