我之前用的是这个,%s是变量的值,这个语句可以使用,就是太长了。
select * from Project where PId like '%%%s%%' or PName like '%%%s%%'or PManager like '%%%s%%' or PEngineer like '%%%s%%'
现在我这个表有二十多列,总不能也这么写吧,请问有更简单的方法吗,或者更简便的SQL语句吗
10 个解决方案
#1
可以用动态拼接sql语句的方式实现
#2
你有必要一次多所有列模糊查询吗?
#3
20多列时可用动态
--调用SYSCOLUMNS生成
--调用SYSCOLUMNS生成
#4
DECLARE @sql NVARCHAR(max)=''
SELECT @sql=@sql+' OR '+name ' LIKE ''%%%s%%''' FROM sys.columns WHERE object_id=OBJECT_ID('Project')--这里可以过滤掉列名name not in
SET @sql=STUFF(@sql,1,3,'')
PRINT @sql
EXEC('SELECT * FROM Project WHERE '+@sql);
#5
USE tempdb
GO
--模拟你的表结构与数据
IF OBJECT_ID('t') IS NOT NULL DROP TABLE t
CREATE TABLE t(
id INT PRIMARY KEY IDENTITY(1,1)
,c1 NVARCHAR(100)
,c2 NVARCHAR(100)
,c3 NVARCHAR(100)
,c4 NVARCHAR(100)
,c5 NVARCHAR(100)
)
INSERT INTO t(c1,c2,c3,c4,c5) VALUES('ab43234','14qg','23fg','32a2','554aw')
INSERT INTO t(c1,c2,c3,c4,c5) VALUES('cde','a','3','bbb','ccc')
INSERT INTO t(c1,c2,c3,c4,c5) VALUES('c2e','a2a','3','b3b','cdc')
--类似下面处理就好了
DECLARE @sql NVARCHAR(MAX),@str NVARCHAR(50)
SELECT @sql=ISNULL(@sql,'')+c.name+' like @str or ' FROM sys.[columns] AS c WHERE c.[object_id]=OBJECT_ID('t','U') AND c.name!='id'
SET @sql='select * from t where ' + SUBSTRING(@sql,1,LEN(@sql)-2)
SET @str='%2%'
EXEC sp_executesql @sql,N'@str nvarchar(50)',@str
#6
DECLARE @s NVARCHAR(100) = 'aaaa' --传入的搜索参数
DECLARE @sql NVARCHAR(MAX) = 'select * from Project where '
DECLARE @col NVARCHAR(MAX) = ''
SELECT @col = @col +' or '+ name + ' like ''%' + @s + '% '''
FROM SYSCOLUMNS
WHERE id = OBJECT_ID('Project')
EXEC( @sql + STUFF(@col,1,3,''))
#7
---可以一次把所有的列都穿在一起然后再like
select * from Project where PId + PName + PManager + PEngineer like '%%%s%%'
#8
楼主注意:
这种字符串值不能随便拼sql , 这样会带来 sql注入 的风险!!!
最好的方式还是 #5 那样参数化查询。
这种字符串值不能随便拼sql , 这样会带来 sql注入 的风险!!!
最好的方式还是 #5 那样参数化查询。
#9
首先谢谢各位大佬。周末玩了两天..
现在的问题是,我在MFC中做的查询,所以这个语句是在Execute(m_sqlCmd, &RecordsAffected, adCmdText);
中的m_sqlCmd的一个语句...用VC确实蛋疼,所以这个语句怎么弄?
DECLARE @sql NVARCHAR(MAX),@str NVARCHAR(50)
SELECT @sql=ISNULL(@sql,'')+c.name+' like @str or ' FROM sys.[columns] AS c WHERE c.[object_id]=OBJECT_ID('t','U') AND c.name!='id'
SET @sql='select * from t where ' + SUBSTRING(@sql,1,LEN(@sql)-2)
SET @str='%2%'
这样怎么才能在MFC中用呢
现在的问题是,我在MFC中做的查询,所以这个语句是在Execute(m_sqlCmd, &RecordsAffected, adCmdText);
中的m_sqlCmd的一个语句...用VC确实蛋疼,所以这个语句怎么弄?
DECLARE @sql NVARCHAR(MAX),@str NVARCHAR(50)
SELECT @sql=ISNULL(@sql,'')+c.name+' like @str or ' FROM sys.[columns] AS c WHERE c.[object_id]=OBJECT_ID('t','U') AND c.name!='id'
SET @sql='select * from t where ' + SUBSTRING(@sql,1,LEN(@sql)-2)
SET @str='%2%'
这样怎么才能在MFC中用呢
#10
最后用的计算列谢啦
#1
可以用动态拼接sql语句的方式实现
#2
你有必要一次多所有列模糊查询吗?
#3
20多列时可用动态
--调用SYSCOLUMNS生成
--调用SYSCOLUMNS生成
#4
DECLARE @sql NVARCHAR(max)=''
SELECT @sql=@sql+' OR '+name ' LIKE ''%%%s%%''' FROM sys.columns WHERE object_id=OBJECT_ID('Project')--这里可以过滤掉列名name not in
SET @sql=STUFF(@sql,1,3,'')
PRINT @sql
EXEC('SELECT * FROM Project WHERE '+@sql);
#5
USE tempdb
GO
--模拟你的表结构与数据
IF OBJECT_ID('t') IS NOT NULL DROP TABLE t
CREATE TABLE t(
id INT PRIMARY KEY IDENTITY(1,1)
,c1 NVARCHAR(100)
,c2 NVARCHAR(100)
,c3 NVARCHAR(100)
,c4 NVARCHAR(100)
,c5 NVARCHAR(100)
)
INSERT INTO t(c1,c2,c3,c4,c5) VALUES('ab43234','14qg','23fg','32a2','554aw')
INSERT INTO t(c1,c2,c3,c4,c5) VALUES('cde','a','3','bbb','ccc')
INSERT INTO t(c1,c2,c3,c4,c5) VALUES('c2e','a2a','3','b3b','cdc')
--类似下面处理就好了
DECLARE @sql NVARCHAR(MAX),@str NVARCHAR(50)
SELECT @sql=ISNULL(@sql,'')+c.name+' like @str or ' FROM sys.[columns] AS c WHERE c.[object_id]=OBJECT_ID('t','U') AND c.name!='id'
SET @sql='select * from t where ' + SUBSTRING(@sql,1,LEN(@sql)-2)
SET @str='%2%'
EXEC sp_executesql @sql,N'@str nvarchar(50)',@str
#6
DECLARE @s NVARCHAR(100) = 'aaaa' --传入的搜索参数
DECLARE @sql NVARCHAR(MAX) = 'select * from Project where '
DECLARE @col NVARCHAR(MAX) = ''
SELECT @col = @col +' or '+ name + ' like ''%' + @s + '% '''
FROM SYSCOLUMNS
WHERE id = OBJECT_ID('Project')
EXEC( @sql + STUFF(@col,1,3,''))
#7
---可以一次把所有的列都穿在一起然后再like
select * from Project where PId + PName + PManager + PEngineer like '%%%s%%'
#8
楼主注意:
这种字符串值不能随便拼sql , 这样会带来 sql注入 的风险!!!
最好的方式还是 #5 那样参数化查询。
这种字符串值不能随便拼sql , 这样会带来 sql注入 的风险!!!
最好的方式还是 #5 那样参数化查询。
#9
首先谢谢各位大佬。周末玩了两天..
现在的问题是,我在MFC中做的查询,所以这个语句是在Execute(m_sqlCmd, &RecordsAffected, adCmdText);
中的m_sqlCmd的一个语句...用VC确实蛋疼,所以这个语句怎么弄?
DECLARE @sql NVARCHAR(MAX),@str NVARCHAR(50)
SELECT @sql=ISNULL(@sql,'')+c.name+' like @str or ' FROM sys.[columns] AS c WHERE c.[object_id]=OBJECT_ID('t','U') AND c.name!='id'
SET @sql='select * from t where ' + SUBSTRING(@sql,1,LEN(@sql)-2)
SET @str='%2%'
这样怎么才能在MFC中用呢
现在的问题是,我在MFC中做的查询,所以这个语句是在Execute(m_sqlCmd, &RecordsAffected, adCmdText);
中的m_sqlCmd的一个语句...用VC确实蛋疼,所以这个语句怎么弄?
DECLARE @sql NVARCHAR(MAX),@str NVARCHAR(50)
SELECT @sql=ISNULL(@sql,'')+c.name+' like @str or ' FROM sys.[columns] AS c WHERE c.[object_id]=OBJECT_ID('t','U') AND c.name!='id'
SET @sql='select * from t where ' + SUBSTRING(@sql,1,LEN(@sql)-2)
SET @str='%2%'
这样怎么才能在MFC中用呢
#10
最后用的计算列谢啦