Sql 为什么informationschema使用like运算符返回格式错误的结果?

Sql 为什么informationschema使用like运算符返回格式错误的结果?,sql,stored-procedures,sql-like,information-schema,Sql,Stored Procedures,Sql Like,Information Schema,我对以下脚本有问题:- USE master DECLARE @COMPANY CHAR(3) declare @createdatabase char(50) declare @fromdatabase char (50) declare @sql1 char(100) declare @logicaldatabasename Char(100) declare @logicaldatabaselog char (100) set @fromdatabase = 'a' set @crea

我对以下脚本有问题:-

USE master

DECLARE @COMPANY CHAR(3)
declare @createdatabase char(50)
declare @fromdatabase char (50)
declare @sql1 char(100)
declare @logicaldatabasename Char(100)
declare @logicaldatabaselog char (100)

set @fromdatabase = 'a'
set @createdatabase = 'b'

SET @COMPANY = 'PUK'

;with q as (
SELECT [name] [logical_name]
FROM sys.[master_files]
WHERE [database_id] = DB_ID(@fromdatabase))
select @logicaldatabasename = q.[logical_name]
from q
where q.[logical_name] not like '%log%'
;with q as (
SELECT [name] [logical_name]
FROM sys.[master_files]
WHERE [database_id] = DB_ID(@fromdatabase))
select @logicaldatabaselog = q.[logical_name]
from q
where q.[logical_name] like '%log%'

select @logicaldatabasename AS LOGICALDATABASENAME, @logicaldatabaselog AS LOGICALDATABSELOG

--BACKUP DATABASE @fromdatabase
--TO DISK = '\folder\'+@fromdatabase+'.bak'
Set @sql1 = 'CREATE DATABASE '+@createdatabase
Exec (@sql1)
RESTORE DATABASE @createdatabase FROM DISK = '\flder\DANTEST.bak' 
WITH MOVE @logicaldatabasename TO 'folder\b.mdf',
MOVE @logicaldatabaselog TO '\folder\b_log.ldf',
REPLACE 
select * from sys.master_files where database_id = db_id(@createdatabase)
;
go
use b
go
;
DECLARE cCursor CURSOR LOCAL FAST_FORWARD FOR


#NAME?
SELECT
  IST.TABLE_NAME AS tblName
FROM
  nhba_a.INFORMATION_SCHEMA.TABLES IST
WHERE RIGHT(IST.TABLE_NAME,3) <> 'PUK' AND IST.TABLE_TYPE = 'BASE TABLE' and ist.TABLE_NAME like '%_%'

ORDER BY IST.TABLE_NAME

--
DECLARE @tblName VARCHAR(255)
--
DECLARE @sql  NVARCHAR(4000)
DECLARE @crlf CHAR(2)

SET @crlf = CHAR(13) + CHAR(10)

OPEN cCursor
FETCH cCursor
INTO @tblName

WHILE @@fetch_status = 0
BEGIN
if @tblname like '%_%'
SET @sql = 'DROP TABLE '+QUOTENAME(@tblName);
EXEC sp_executesql @sql;

  FETCH cCursor
  INTO @tblName
END
使用此选项时:-

SELECT
  IST.TABLE_NAME AS tblName
FROM
  nhba_a.INFORMATION_SCHEMA.TABLES IST
WHERE RIGHT(IST.TABLE_NAME,3) <> 'PUK' AND IST.TABLE_TYPE = 'BASE TABLE' and ist.TABLE_NAME like '%_%'

ORDER BY IST.TABLE_NAME
我得到了没有u的表,但我搜索了只有u的表

有人能解释一下为什么它不能返回正确的结果,以及sql在后台实际做了什么吗

我尝试了各种方法来得出正确的结果,但没有找到问题所在,因为逻辑是合理的。

当您使用LIKE运算符时,下划线实际上是指任何一个字符。这意味着u对LIKE运算符有特殊意义

如果要返回带有下划线的表名,则需要在where子句中转义下划线,如

WHERE TABLE_NAME like '%\_%' ESCAPE '\'
也可以使用方括号来转义下划线,而不使用关键字escape


哇,谢谢你的知识,逃跑成功了,但括号没有。
WHERE TABLE_NAME like '%[_]%'