SQL 服务器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'

I got this Error

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

您应该始终指定变量的长度,因此nvarchar(100),否则它将默认为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

我建议你先试试这个,看看你是否仍然得到错误。

首先-请使用表别名。

第二,重写你的查询,你正在使用旧的ANSI样式。

第三,定义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

相关内容

  • 没有找到相关文章

最新更新