日期:2014-05-17  浏览次数:20448 次

【求看】【动态SQL】列名为变量时,where子句后面是表单上得到的变量
列名为变量时,where子句后面是表单上得到的变量

存储过程
create proc  sp_xs
@JGBZ nVARCHAR(50),
@column1 nVARCHAR(50)

as
declare @sel nvarchar(500)

用下面语句:
exec sp_executesql N'select  @column1  from 刻蚀 where 加工步骤=@JGBZ'
执行
sp_xs'P+ET','SRJY'
结果为:空,搜不到记录

-------------------------------------

用下面语句:
--set @sel = 'select '+ @column1+' from 刻蚀 where 加工步骤=''+ @JGBZ +'''
 Exec(@sel)
执行
sp_xs'P+ET','SRJY'

结果为:
必须声明变量 '@column1'。                  求各位大虾赐教!!!

动态SQL

------解决方案--------------------
CREATE proc  sp_xs
@JGBZ nVARCHAR(50),
@column1 nVARCHAR(50)

as
declare @sel nvarchar(500)
set @sel = 'select '+ @column1+' from 刻蚀 where 加工步骤='''+ @JGBZ +''''
 EXEC (@sel)

------解决方案--------------------
alter proc  sp_xs
@JGBZ NVARCHAR(50),
@column1 nVARCHAR(50)
as
declare @sel nvarchar(500)
SET @sel = N'select ' + @column1 + ' from 刻蚀 where 加工步骤=@JGBZ' --#2.字段名,表名,无法用传参的方式动态。想动态只能拼SQL
exec sp_executesql @sel, N'@JGBZ NVARCHAR(50)', @JGBZ --#1.缺少后面两个参数
GO

EXEC sp_xs 'P+ET','SRJY'
GO

CREATE proc  sp_xs1
@JGBZ nVARCHAR(50),
@column1 nVARCHAR(50)
as
declare @sel nvarchar(500)
set @sel = 'select '+ @column1+' from 刻蚀 where 加工步骤='''+ @JGBZ +''''  --这儿少了'号
--PRINT @sel
Exec(@sel)
GO

EXEC sp_xs1 'P+ET','SRJY'
GO