P东风 2014-09-23 08:46 采纳率: 0%
浏览 2487

将查询到的结果分别赋值给不同的变量??

declare @tablename varchar(100)='Bsheet',--示例表
@keyname varchar(80),
@keyname1 varchar(80),
@keyname2 varchar(80),
@keyname3 varchar(80),
@keyname4 varchar(80),
@keyname5 varchar(80),
@i int =0,
@sql1 Nvarchar(1000);

declare C cursor fast_forward READ_ONLY
for
select rtrim(b.name) as Keycolname --这段代码得到这个表所有主键>2
from sysobjects a,syscolumns b ,

(
select g.id,g.colid,g.keyno

from sysindexes f,sysindexkeys g

where f.id = g.id and f.indid = g.indid and f.indid > 0

and f.indid < 255 and (f.status & 2048)<>0
) h
where a.id = b.id

and a.id = object_id(@tablename)
and b.id = h.id

and b.colid = h.colid

order by h.keyno
open C
fetch next from C into @keyname;
while @@FETCH_STATUS =0
begin
set @i = @i+1;
set @sql1=N'set @keyname'+CAST(@i as varchar(8))+'='+@keyname
exec (@sql1);
fetch next from C into @keyname;
end

close C
deallocate C;

select @keyname1,@keyname2,@keyname3,@keyname4,@keyname5

--这个游标就是想实现类似这样的功能:
set @keyname1=@keyname;
set @keyname2=@keyname;
set @keyname3=@keyname;
set @keyname4=@keyname;
set @keyname5=@keyname;

结果他报错了。请问高手如何实现??其他方法不限。

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-02 18:27
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在SQL Server中,你可以使用DECLARE语句来声明一个变量,并通过SET语句来设置这个变量的值。然而,在你的例子中,你提到的@sql1@keyname并没有被正确地引用或初始化。此外,你在set @keyname1=@keyname;这行代码中尝试将@keyname重命名为@keyname1,但是实际上它已经被@i替代了。

    如果你想要在循环中改变这些变量的值,你需要确保它们已经定义并且有正确的初始化。例如,你可以这样做:

    DECLARE @tablename VARCHAR(100) = 'Bsheet' -- 示例表名
    DECLARE @keyname VARCHAR(80)
    DECLARE @keyname1 VARCHAR(80)
    DECLARE @keyname2 VARCHAR(80)
    DECLARE @keyname3 VARCHAR(80)
    DECLARE @keyname4 VARCHAR(80)
    DECLARE @keyname5 VARCHAR(80)
    DECLARE @i INT = 0
    
    DECLARE C CURSOR FAST_FORWARD READ_ONLY FOR
    
    SELECT 
        LTRIM(RIGHT(B.Name, 2)) AS KeyColName
    FROM 
        sysobjects A,
        syscolumns B,
        (
            SELECT G.Id, GColiId, KeyNo
            FROM sysindexes F,
                 sysindexkeys G
            WHERE 
                F.Id = G.Id AND
                F.IndID = G.IndID AND
                F.IndID > 0 AND
                F.IndID < 255 AND
                (F.Status & 2048) <> 0
        ) H
    WHERE 
        A.Id = B.Id AND 
        A.Id = OBJECT_ID(@tablename) AND 
        B.Id = H.Id AND 
        B.ColiId = H.ColiId
    ORDER BY H.KeyNo
    
    OPEN C
    
    FETCH NEXT FROM C INTO @keyname
    
    WHILE @@FETCH_STATUS = 0
    BEGIN
        SET @i = @i + 1
        SET @sql1 = N'SET @keyname' + CAST(@i AS VARCHAR(8)) + '=' + @keyname
    
        EXEC (@sql1)
    
        FETCH NEXT FROM C INTO @keyname
    END
    
    CLOSE C
    DEALLOCATE C;
    

    在这个例子中,我们首先声明了一个包含所有列名的字符串数组@tablename,然后为每个可能的列名声明了一个新的变量@keyname。然后,我们创建了一个游标并读取数据。在循环内部,我们使用SET @keyname来设置@keyname的值,并使用EXEC语句执行SQL命令。最后,我们在循环结束后关闭游标并释放资源。

    评论

报告相同问题?