SQL 服务器 sp_executesql ')' 附近的语法不正确
SQL SERVER sp_executesql incorrect syntax near ')'
我在 sql 服务器 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 ')'.
您应该始终指定变量的长度,因此 nvarchar(100) 否则它将默认为 1 个字符。
只需通过打印来测试变量存储的内容:
print @sql
print @params
没有设置长度,唯一打印的是
@
为什么 @sql
变量只有“@”而不是 SELECT
关键字中的 "S"?因为您在 @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 ''%''+@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
我建议你先试试这个,看看你是否仍然得到这个错误。
首先-请使用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 '%'+@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
我在 sql 服务器 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 ')'.
您应该始终指定变量的长度,因此 nvarchar(100) 否则它将默认为 1 个字符。
只需通过打印来测试变量存储的内容:
print @sql
print @params
没有设置长度,唯一打印的是
@
为什么 @sql
变量只有“@”而不是 SELECT
关键字中的 "S"?因为您在 @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 ''%''+@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
我建议你先试试这个,看看你是否仍然得到这个错误。
首先-请使用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 '%'+@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