将字符串附加到SQL Server存储过程

时间:2016-03-24 05:47:43

标签: sql-server stored-procedures

我正在尝试将表名动态附加到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

2 个答案:

答案 0 :(得分:2)

您需要为字符串变量明确定义 长度

@tname

否则,您的变量@sqlvarchar正好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