我正在尝试将表名动态附加到SQL Server存储过程,但是我收到错误:
无法找到存储过程的'
代码:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[atest_demo_sp]
@name varchar(10)
AS
BEGIN
Declare @tname nvarchar
Declare @sql nvarchar
set @tname = @name
Set @sql = 'select * from ' + convert(varchar(10), @tname)
-- select @sql
execute sp_executesql @sql
END
答案 0 :(得分:2)
您需要为字符串变量明确定义 长度!
@tname
否则,您的变量@sql
和varchar
将正好1个字符长!可能不你想要的东西!
有关详细信息,请参阅此博客文章:Bad habits to kick : declaring VARCHAR without (length)
另外,作为旁注:要么选择nvarchar
(非Unicode),要么使用nvarchar
(Unicode) - 但不要混淆两者。 如果使用N'...'
,则始终使用{{1}}表示法来分配字符串文字。
答案 1 :(得分:1)
varchar
的问题,无需在此处将nvarchar
分配给@tname
。避免使用@name
变量并直接在SET
语句中使用varchar
,因为它已经是@name
。
希望@tname
的第一个字符仅分配给@sql
。还需要将Declare @sql varchar(100);
Set @sql = 'select * from ' + @name
定义为一定长度。
使用以下声明,它将起作用:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[atest_demo_sp]
@name varchar(10)
AS
BEGIN
Declare @tname nvarchar(200) -- DEFINE A LENGTH HERE !!!
Declare @sql nvarchar(200) -- DEFINE A LENGTH HERE !!!
set @tname = @name
Set @sql = N'select * from ' + convert(nvarchar(10), @tname)
-- select @sql
execute sp_executesql @sql
END