Sql 我可以使用条件语句中的变量作为测试该值的where条件的值吗

Sql 我可以使用条件语句中的变量作为测试该值的where条件的值吗,sql,sql-server-2008,variables,stored-procedures,Sql,Sql Server 2008,Variables,Stored Procedures,我有以下存储过程: 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

我有以下存储过程:

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 in变量的结果,然后使用该值

我正在使用SQLServer2008(9.0RTM)

这将是一个存储过程


提前感谢

您可以使用
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;

不确定为什么要通过所有循环插入到表中,在表中可以有一个简单的插入查询,如

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确定的列中检索工资值,然后使用作为参数传递的值和检索到的工资插入到employ中,我认为您可以将您的过程重构为:

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'

(对表结构做了一些假设)

Gnumber是整数还是字符串?它是字符串nvarcharrif如果您再次查看原始过程,您将看到源表中没有
salary
列。它是通过连接
's'+@snum
建立起来的。除非我完全误读了。@jpw。。谢谢我确实错过了信息。我已经编辑了我的脚本来反映这一点。我不需要看到动态SQL。这比公认的答案要好得多。mate我需要它,因为我需要传递列名@value@user3766910.. 您的
@value
是从
@snum
派生而来的,它反过来用于从GrideBtable返回列值。如果@snum=1,则从表
GrideBtable
中的列
s1
获取值;如果@snum=2,则从
GrideBtable
检索列
s2
值。我想这取决于
GrideBtable
中有多少列。您可以选择使用动态插入查询或简单插入查询如何使用@val out将其保存到变量中?