我正在努力提高SQL编程的效率。 我试图运行一个循环来重复一个只更改数字后缀的字段名称的更新命令。
例如,不是写出x_1, y_1
,而是为每次更新写x_2, y_2
:
DECLARE @a INT
DECLARE @b VARCHAR
SET @a = 1
WHILE @a < 30
set @b = @a
BEGIN
UPDATE source set h = h + "x_"+@b
where "y_"+@b = 'Sold'
SET @a = @a + 1
END
如果我能澄清,请告诉我。我正在使用SQL Server 2005。
感谢任何指导。
我正在尝试应用Adams的解决方案,需要了解以下内容的正确用法:
exec sp_executesql update source_temp set pmt_90_day = pmt_90_day + convert(money,'trans_total_'+@b'')
where convert(datetime,'effective_date_'+@b) <= dateadd(day,90,ORSA_CHARGE_OFF_DATE)
and DRC_FLAG_'+@b = 'C'
答案 0 :(得分:8)
这实际上不起作用,因为您不能在引号中使用列名。你实际上在做的是让SQL比较两个总是不同的字符串,这意味着你永远不会执行更新。
如果你必须这样做,你必须有类似......
DECLARE @a INT
DECLARE @b VARCHAR
SET @a = 1
WHILE @a < 30
BEGIN
set @b = @a
exec sp_executesql N'UPDATE source set h = h + 'x_'+@b + N'
where y_'+@b + N' = ''Sold'''
SET @a = @a + 1
END
但是,总的来说,我不鼓励这种做法。我不喜欢在任何类型的生产代码的另一个SQL语句中生成动态SQL。对于进行一次性开发任务非常有用,但我不喜欢它可以由用户执行的代码。
答案 1 :(得分:1)
这是一种更好的模拟这种情况的方法:
CREATE TABLE Contacts (
contact_id INT NOT NULL,
contact_name VARCHAR(20) NOT NULL,
contact_description VARCHAR(500) NULL,
CONSTRAINT PK_Contacts PRIMARY KEY CLUSTERED (contact_id)
)
CREATE TABLE Contact_Phones (
contact_id INT NOT NULL,
phone_type VARCHAR(10) NOT NULL,
phone_number VARCHAR(20) NOT NULL,
CONSTRAINT PK_Contact_Phones PRIMARY KEY CLUSTERED (contact_id, phone_type),
CONSTRAINT CK_Contact_Phones_phone_type CHECK (phone_type IN ('HOME', 'FAX', 'MOBILE'))
)
现在,您不是尝试连接字符串来处理不同的列,而是可以将它们作为一个集合处理,并通过业务逻辑获取您想要的电话号码。 (对不起,我没有使用你的例子,但它似乎有点过于笼统而且难以理解)。
答案 2 :(得分:0)
while @count < @countOfSession
begin
if @day = 'Saturday' or @day = 'Tuesday'
begin
if @day='Saturday'
begin
select @date
set @day='Tuesday'
set @count=@count+1
set @date=@date+3
end
else if @day='Tuesday'
begin
select @date
set @day='Saturday'
set @count=@count+1
set @date=@date+4
end
end
end