如何用动态计数执行GO语句?

时间:2015-03-10 19:39:29

标签: sql sql-server database tsql

如何设置GO语句的动态计数?

我收到以下错误:

  

发生了致命的脚本错误。遇到了不正确的语法   在解析Go时。

当我尝试运行以下查询时:

Declare @count int
Select @count=COUNT(*) From Users 

Insert Into #DummyUsers 
Select * from Users where UserName = 'Sachin' 

GO @Count

但是当我使用下面带有硬编码计数的查询时,同样正常。

Declare @count int
Select @count=COUNT(*) From Users 

Insert Into #DummyUsers 
Select * from Users where UserName = 'Sachin' 

GO 5

如果您对此有任何想法,请感谢您的建议。

6 个答案:

答案 0 :(得分:5)

你不能。一旦SSMS遇到GO,批处理就会终止并且您的变量不再存在。

答案 1 :(得分:1)

您不能将count参数的变量用于GO,但在您的示例中(可能会设计)您可以加入Users

Insert Into #DummyUsers 
Select U.* from Users U
INNER JOIN Users U2
    ON U.UserName = 'Sachin' 

其他选择:

  • Dynaimc SQL(通过连接字符串构建SQL)并通过SQLCMD.EXEOSQL.EXE执行
  • 使用带计数器的WHILE循环

答案 2 :(得分:0)

相反,试试这个。

DECLARE @cntr INT=1

WHILE @cntr <= @count
  BEGIN
      INSERT INTO #DummyUsers
      SELECT *
      FROM   Users
      WHERE  UserName = 'Sachin'

      SET @cntr+=1
  END 

答案 3 :(得分:0)

我会循环播放

Declare @count int
Select @count=COUNT(*) From Users 

WHILE(@count > 0)
BEGIN
    Insert Into #DummyUsers 
    Select * 
    FROM Users 
    WHERE UserName = 'Sachin' 

    SET @count = @count - 1;
END

答案 4 :(得分:0)

虽然我同意其他人认为可能有更好的方法来实现您想要做的事情,如果我们没有看到某些限制,您可以考虑使用sequence

您创建的序列仍然存在,可以根据需要重置,您可以增加&#34;它通过调用NEXT VALUE FOR函数

答案 5 :(得分:0)

如果您只想插入重复的行,可以使用CTE或数字表。

-- Sample data.
declare @Users as Table ( UserId Int Identity, Name VarChar(16) );
insert into @Users ( Name ) values
  ( 'Bob' ), ( 'Carol' ), ( 'Ted' ), ( 'Alice' );
select * from @Users;

-- Load another table with repetitions of a single user.
declare @TempUsers as Table ( UserId Int, Name VarChar(16) );
declare @Repetitions as Int = ( select Count(*) from @Users );
with TempUsers as (
  select UserId, Name, 1 as Repetitions
    from @Users
    where Name = 'Ted'
  union all
  select UserId, Name, Repetitions + 1
    from TempUsers
    where Repetitions < @Repetitions
  )
insert into @TempUsers ( UserId, Name )
  select UserId, Name
    from TempUsers;
select * from @TempUsers;