看一下我的存储过程和调用方法,再回答
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[sp_L_MbDetail_Insert]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[sp_L_MbDetail_Insert]
GOSET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
--------------------------------------------------------------------------
--Procedure Name : [dbo].[sp_L_MbDetail_Insert]
--Note : sp_L_MbDetail_Insert
--Created By : Li
--Created Date : 2009-8-3
--------------------------------------------------------------------------CREATE PROCEDURE [dbo].[sp_L_MbDetail_Insert]
(
@Field nvarchar(500),
@Value nvarchar(500),
@tableName nvarchar(100),
@num int output
)AS
Declare @Sql nvarchar(1000)
begin tran
set @Sql='insert into '+@tableName+'('+@Field+') values('+@Value+')'
exec(@Sql)
set @num=1;
IF @@ERROR<>0
BEGIN
set @num=0
ROLLBACK TRAN
END
ELSE
BEGIN
COMMIT TRAN
ENDreturn
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GOexec sp_L_MbDetail_Insert 'Super_Info_SpXlColumnXxSet_12','Xlid,Field128928153557656250,Field128928158271406250,Field128928153670781250','22,0,0,0',0执行的错误提示是下面的
服务器: 消息 170,级别 15,状态 1,行 1
第 1 行: '22' 附近有语法错误。
提示,字段名,表字,插入的内容,都是通过程序传过来的,Xlid是整形,其他都是字符串类型,请问一下这个我应该怎么改比较好,要是有更好的方法也可以提供一下
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[sp_L_MbDetail_Insert]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[sp_L_MbDetail_Insert]
GOSET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
--------------------------------------------------------------------------
--Procedure Name : [dbo].[sp_L_MbDetail_Insert]
--Note : sp_L_MbDetail_Insert
--Created By : Li
--Created Date : 2009-8-3
--------------------------------------------------------------------------CREATE PROCEDURE [dbo].[sp_L_MbDetail_Insert]
(
@Field nvarchar(500),
@Value nvarchar(500),
@tableName nvarchar(100),
@num int output
)AS
Declare @Sql nvarchar(1000)
begin tran
set @Sql='insert into '+@tableName+'('+@Field+') values('+@Value+')'
exec(@Sql)
set @num=1;
IF @@ERROR<>0
BEGIN
set @num=0
ROLLBACK TRAN
END
ELSE
BEGIN
COMMIT TRAN
ENDreturn
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GOexec sp_L_MbDetail_Insert 'Super_Info_SpXlColumnXxSet_12','Xlid,Field128928153557656250,Field128928158271406250,Field128928153670781250','22,0,0,0',0执行的错误提示是下面的
服务器: 消息 170,级别 15,状态 1,行 1
第 1 行: '22' 附近有语法错误。
提示,字段名,表字,插入的内容,都是通过程序传过来的,Xlid是整形,其他都是字符串类型,请问一下这个我应该怎么改比较好,要是有更好的方法也可以提供一下
前加个
print (@sql)然后在查询分析器中
执行exec sp_L_MbDetail_Insert 'Super_Info_SpXlColumnXxSet_12','Xlid,Field128928153557656250,Field128928158271406250,Field128928153670781250','22,0,0,0',0
我改成这样还是出错了
exec sp_L_MbDetail_Insert 'Xlid,[Field128928153557656250],[Field128928158271406250],[Field128928153670781250]','115,''厅夺'',''城'',''辰天''','Super_Info_SpXlColumnXxSet_12',0
对了,谢谢四楼,我还想问一下,这个在程序里面怎么加啊?
set @Sql='insert into '+@tableName+'('+@Field+') values('+@Value+')'
print(@Sql)
exec(@sql)
execute sp_executesql
N'select * from pubs.dbo.employee where job_lvl = @level',
N'@level tinyint',
@level = 35
执行可以多次重用或动态生成的 Transact-SQL 语句或批处理。Transact-SQL 语句或批处理可以包含嵌入参数。语法
sp_executesql [@stmt =] stmt
[
{, [@params =] N'@parameter_name data_type [,...n]' }
{, [@param1 =] 'value1' [,...n] }
]
declare @t int
set @t=0
execute sp_executesql
N'select @count=count(1) from pubs.dbo.employee where job_lvl = @level',
N'@level tinyint, @count int output',
@level = 35,@count=@t outputselect @t
看到这个可能你就理解了,其实很简单,sp_executeSql参数分成了三个部分。
第一部分就是要执行的Sql语句,这是一个字符串,任意的,只要语法正确。
第二部分就是所需的参数定义,名称类型及大小方向。
第三部分就是实际的对应的参数值。按名称匹配。
在调用完成后可以取到传出参数。