有没有大神给解决一下?说出个大字意识。
sqlserver吧
全部回复
仅看楼主
level 2
凡事一😄 楼主
有没有大神给解决一下?说出个大字意识。
2021年10月21日 22点10分 1
level 1
@tmtony 大佬 求解释下
2021年10月27日 03点10分 2
level 6
建临时表#T
吧数据写进临时表
建@SQL变量写动态sql,@where变量记录动态SQL的条件
把@SQL变量中{WHERE}部分替换成@where变量的数据
执行动态@SQL中的SQL
PS:语法就是T-SQL,也就是SQL SERVER的,但是创建表的时候只创建了5个列,其中查询中2个列为1的数据。
@SQL变量就是查询#T表=2,而替换的@where变量则是通过系统表sys.columns循环获得临时表#T的字段进行union all赋值。
2021年10月27日 06点10分 3
level 6
不过这个方法也是难懂,如果是我就改成:
CREATE TABLE #T
(A BIT,B BIT,C BIT,D BIT,E BIT)
INSERT INTO #T VALUES(1,0,1,0,1),(0,0,1,0,1),(1,0,1,0,0)
DECLARE @sql VARCHAR(max)=''
SET @sql='SELECT *FROM #T WHERE 2=(0'+(SELECT '+'+name FROM tempdb.sys.columns WHERE OBJECT_ID=object_id('tempdb..#T')FOR XML PATH(''))+' )'
EXEC (@sql)
然而如果根据原题是布尔型,还需要把true转换成函数。还需要关联dbo.systypes表针对字段类型进行case操作才严谨。不过我懒得写了。。。。
2021年10月27日 06点10分 4
参数替代 我明白,就是我把全部参数替代完后,完整的sql怎么运行的看不明白,请看楼下截图
2021年10月27日 06点10分
level 1
如图
2021年10月27日 06点10分 5
select 0 as value union all A union all B..... 跟我写的 0+A+B 一个意思。只是他复杂化而已。union all 的A\B\C\D\E全是在
#T里面来的。 如果给#
T加个别名 a,那么就是select 0 as value union all a.A union all a.B..... 这样可读性会增强。
2021年10月27日 06点10分
还有,你不用拼他的SQL。只需要print(@SQL)就能显示出对方的SQL了。平时维护动态SQL多用print()吧。省得自己慢慢拼那么麻烦
2021年10月27日 06点10分
@咸鱼初号机💤 的确,加上别名就容易懂了,我一直没搞明白,它的abcde怎么自动识别来自#T的
2021年10月27日 06点10分
@咸鱼初号机💤 感觉被 select from 句式禁锢住思维了
2021年10月27日 06点10分
1