在期望条件的上下文中指定了一个非布尔类型的表达式的情况。

23 浏览
0 Comments

在期望条件的上下文中指定了一个非布尔类型的表达式的情况。

使用[DBName]

GO

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

DECLARE @MainTableNames TABLE(TableName varchar(100))

DECLARE @TransmissionTableName TABLE (TransTableName varchar(100), RelationColName varchar(100))

DECLARE @NextTransmissionIDs TABLE(TransmissionID bigint)

DECLARE @HoldMainName varchar(100)

DECLARE @SourceServer varchar(max)

DECLARE @DestinationServer varchar(max)

DECLARE @vsql varchar(max)

DECLARE @flag int

SET @SourceServer='[XYZ].[DBName].[dbo]'

SET @DestinationServer='[ABC].[DBName].[dbo]'

INSERT INTO @MainTableNames(TableName)

VALUES ('A'),('B'),('C'),('D');

IF OBJECT_ID('tempdb..#NextIDs','local') IS NOT NULL

DROP TABLE #NextIDs

CREATE TABLE #NextIDs (

UniqueID varchar(100))

DECLARE maintablecursor CURSOR FOR

SELECT TableName FROM @MainTableNames

DECLARE @MainTabName varchar(100)

DECLARE @TransTabName varchar(100)

DECLARE @TransRelationCol bigint

IF NOT EXISTS(SELECT 1 FROM sys.servers WHERE name='ABC')

BEGIN

EXEC sp_addlinkedserver @server = 'ABC'

PRINT '已添加服务器到列表中'

END

OPEN maintablecursor

FETCH NEXT FROM maintablecursor INTO @MainTabName

DECLARE @StartDate datetime

DECLARE @EndDate datetime

SET @StartDate = '2017-07-05 00:00:00.000'

SET @EndDate = '2017-07-05 23:59:59.000'

SELECT @HoldMainName = @MainTabName

--SET @vsql=' SELECT 1 FROM '+@SourceServer+'.'+ @MainTabName+' WHERE [dbo].'+@MainTabName+'.[receiptdt] >='+@StartDate+' and [dbo].'+@MainTabName+'.[receiptdt] <= '+@EndDate+' and transmissiontid is not null'

--EXEC(@vsql) **使用但在receiptdt和while循环附近出现错误**

--while EXISTS (EXEC(@vsql))

--BEGIN

SET @vsql=' INSERT INTO #NextIDS(UniqueID) SELECT TOP 1 ID FROM '+@SourceServer+'.'+@MainTabName +

' WHERE convert(datetime, [dbo].'+@MainTabName+'.[receiptdt], 102) <= cast('+ @EndDate+' AS DATETIME) and ID is not null;'

EXEC(@vsql)

SET @vsql =' INSERT INTO '+ @DestinationServer+'.'+@MainTabName+

' SELECT * FROM ' +@SourceServer+'.'+@MainTabName+' AS a

INNER JOIN #NextIDs AS b ON a.transmissiontid = b.UniqueID'

EXEC(@vsql)

PRINT @MainTabName + '在插入时'

FETCH NEXT FROM maintablecursor INTO @MainTabName

WHILE @@FETCH_STATUS = 0

BEGIN

SET @vsql=' INSERT INTO '+ @DestinationServer+'.'+@MainTabName+

' SELECT * FROM ' +@SourceServer+'.'+@MainTabName+' AS a

INNER JOIN #NextIDs AS b ON a.transmissiontid = b.UniqueID'

EXEC(@vsql)

PRINT @MainTabName + '在插入时'

SET @vsql= ' DELETE '+ @SourceServer+'.'+@MainTabName+

' FROM ' + @SourceServer+'.'+@MainTabName+ ' AS a

INNER JOIN #NextIDs AS b ON a.transmissiontid = b.UniqueID'

EXEC(@vsql)

PRINT @MainTabName + '在删除时'

FETCH NEXT FROM maintablecursor INTO @MainTabName

END --Cursor END

CLOSE maintablecursor;

DEALLOCATE maintablecursor;

SET @vsql= ' DELETE '+ @SourceServer+'.'+@HoldMainName+

' FROM '+ @SourceServer+'.'+@HoldMainName+ ' AS a

INNER JOIN #NextIDs AS b ON a.transmissiontid = b.UniqueID'

PRINT(@HoldMainName)

-- END --while loop end

0
0 Comments

这段代码中出现了一个问题:在期望条件的上下文中指定了一个非布尔类型的表达式。这个问题的原因可能是在代码中的某个地方,使用了一个非布尔类型的表达式作为条件判断的依据,而在这个上下文中,只能接受布尔类型的表达式。

要解决这个问题,我们需要检查代码中的条件判断语句,并确保使用的表达式是布尔类型的。在这段代码中,我们可以看到在print语句中出现了问题。print语句后面的括号中应该填写一个布尔类型的表达式,来判断是否要执行打印操作。

下面是修正后的代码:

Set ='SELECT 1 FROM '++'.'+ +
          ' WHERE [dbo].'++'.[receiptdt] >='++
                 ' and [dbo].'++'.[receiptdt] <= '++
                 ' and transmissiontid is not null'
print (1);

在修正后的代码中,我们将print语句的括号中的表达式改为了一个布尔类型的值1。现在,当条件满足时,print语句将被执行并打印出1。如果条件不满足,则print语句不会执行。

通过这样的修改,我们解决了原始代码中出现的"case an expression of non-boolean type specified in a context where a condition is expected"这个问题。现在,代码可以正确地执行并打印出预期的结果。

0