mssql sqlserver “sp_executesql”系统存储过程运行注意事项


摘要:
今天使用sql server 2008 创建存储过程,在存储过程中使用系统存储过程”sp_executesql”动态运行sql脚本,提示错误信息,
————————————————————
过程需要类型为 ‘ntext/nchar/nvarchar’ 的参数 ‘@statement’
先将解决方法记录如下:

通过翻看
MSSQL sp_executesql exec 用法简介
,发现sp_executesql存储过程接收动态sql需为nchar 、ntext、nvarchar 三种类型,即再动态定义sql时候,将其类型修改为以上三种类型中的任意一种,即可完成相关操作。

例:

IF EXISTS (SELECT * FROM sys.objects WHERE OBJECT_ID = OBJECT_ID(N'[dbo].[pr_test]') AND type IN (N'P', N'PC'))
DROP PROCEDURE [dbo].[pr_test] 
GO

create proc pr_test 
@str varchar(30)
as
begin 
  declare @sql  varchar(max)
  set @sql='select * from tableName where [info]=@str '
  exec sp_executesql @sql,N'@str varchar(30)',@str 
end 
   ----运行存储过程-----
   exec pr_test 'test' 
   ---弹出相应的错误信息
   ---过程需要类型为 'ntext/nchar/nvarchar' 的参数 '@statement'

将动态sql变量参数类型修改为nvarchar重新运行及完成相关操作.

IF EXISTS (SELECT * FROM sys.objects WHERE OBJECT_ID = OBJECT_ID(N'[dbo].[pr_test]') AND type IN (N'P', N'PC'))
DROP PROCEDURE [dbo].[pr_test] 
GO



create proc pr_test 
@str varchar(30)
 as
  begin 
    declare @sql  nvarchar(max)  
      ---动态变量接收sql信息必须使用 'ntext/nchar/nvarchar' 类型
      set @sql='select * from tableName where [info]=@str '
      exec sp_executesql @sql,N'@str varchar(30)',@str 
  end 

----运行存储过程-----
  exec pr_test 'test' 
----输出相应的查询结果-----