[英]Can I pass variable to select statement as column name with where condition value from variable
[英]Can I use variable in condition statement as value with where condition that test that value
我有以下存储过程:
ALTER proc [dbo].[insertperoll] @name nvarchar(50) , @snum int , @gnum int
as
DECLARE @value nvarchar(10)
SET @value = 's'+CONVERT(nvarchar(50),@snum)
DECLARE @sqlText nvarchar(1000);
DECLARE @sqlText2 nvarchar(1000);
DECLARE @sqlText3 nvarchar(1000);
declare @g nvarchar(50) = '''g1'''
SET @sqlText = N'SELECT ' + @value + N' FROM dbo.GrideBtable'
SET @sqlText2 = ' where Gnumber = '+@g --here is the problem it error invalid column name -- the @g is value from the table condition
set @sqlText3 = @sqlText+@sqlText2
Exec (@sqlText3) -- here how can i save the result of the exec into varibale
declare @sal nvarchar(50) = @sqlText3
insert employ (name,Snumber,Gnumber,Salary) values(@name,@snum,@gnum,@sal)
问题:当我执行它时,如何将条件变量从表中获取值,它认为@g是列,但不是表中的值来对其进行测试,因此我在执行后显示一个值,另一个问题是将exec的结果保存到变量中,然后使用该值
我正在使用SQL Server 2008(9.0 RTM)
这将是一个存储过程
提前致谢
不知道为什么要遍历所有循环才能插入到表中,在表中可以有一个简单的插入查询,如..
ALTER PROC dbo.[insertperoll] @name nvarchar(50) , @snum int , @gnum int
AS
insert employ (name, Snumber, Gnumber, Salary)
select @name
, @sum
, @gnum
, case when @snum = 1 then s1
when @snum = 2 then s2
when @snum = 3 then s3
when @snum = 4 then s4
end as Salary
from dbo.GrideBtable
where Gnumber = @gnum
如果您打算让proc从参数snum所确定的列中检索薪水值,然后使用作为参数传递的值和获取的薪水进行插入,则我认为您可以将过程重构为:
CREATE proc [dbo].[insertperoll] @name nvarchar(50) , @snum int , @gnum int AS
DECLARE @g NVARCHAR(50) = 'g1'
DECLARE @sql NVARCHAR(MAX);
SET @sql = N'INSERT employ (name,Snumber,Gnumber,Salary) '
SET @sql += N'SELECT ' + QUOTENAME(@name, '''')
SET @sql += N', ' + CAST(@snum AS NVARCHAR(50))
SET @sql += N', ' + CAST(@gnum AS NVARCHAR(50))
SET @sql += N', s' + CAST(@snum AS NVARCHAR(50))
SET @sql += N' FROM dbo.GrideBtable'
SET @sql += N' WHERE Gnumber = ' + QUOTENAME(@g, '''')
EXEC (@sql)
当然,您可以将@g变量添加到过程参数中,而不是在过程中进行硬编码并将其称为:
EXEC insertperoll @name='john', @snum=10, @gnum=100, @g='g1'
示例SQL Fiddle (对表结构进行了一些假设)
您可以使用sp_executesql
而不是exec()
来执行此操作,因为这将允许您使用参数,可以使用输出参数从查询中获取值:
DECLARE @SQL NVARCHAR(MAX) = N'SELECT @val = ' + CONVERT(NVARCHAR(10),@snum) +
N' FROM dbo.GrideBtable WHERE Gnumber = @G1';
DECLARE @val INT; -- NOT SURE OF DATATYPE REQUIRED
EXECUTE sp_executesql @SQL, N'@G1 VARCHAR(20), @val INT OUT', 'G1', @val OUT;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.