Sql server 具有相似条件的动态SQL
我尝试了以下代码的多种不同组合,但总是出现相同的错误 我发现以前的解决方案没有嵌入动态SQL的额外复杂性。任何帮助都将不胜感激 代码: 错误: Msg 402,16级,状态1,第6行Sql server 具有相似条件的动态SQL,sql-server,Sql Server,我尝试了以下代码的多种不同组合,但总是出现相同的错误 我发现以前的解决方案没有嵌入动态SQL的额外复杂性。任何帮助都将不胜感激 代码: 错误: Msg 402,16级,状态1,第6行 模运算符中的数据类型varchar和varchar不兼容 错误发生在这里: DECLARE @modulo as NVARCHAR(5) = ''%''; 这被解释为查找两个空字符串的模值 在这里使用单引号 更新注意! 还有一点:您必须在LIKE中为表名添加双引号才能创建正确的语句 DECLARE @COL_SE
模运算符中的数据类型varchar和varchar不兼容
错误发生在这里:
DECLARE @modulo as NVARCHAR(5) = ''%'';
这被解释为查找两个空字符串的模值
在这里使用单引号
更新注意!
还有一点:您必须在LIKE
中为表名添加双引号才能创建正确的语句
DECLARE @COL_SELECT AS NVARCHAR(2000)
SET @COL_SELECT = '
SELECT DISTINCT column_name
FROM information_schema.COLUMNS
WHERE table_name = ''' + @table + '''
AND column_name like ''' + @modulo + @column + @modulo + ''''
这样的东西应该运行良好:
DECLARE @table as NVARCHAR(25) = 'proposals'
DECLARE @column as NVARCHAR(25) = 'daypart'
DECLARE @modulo as NVARCHAR(5) = '%'
DECLARE @COL_SELECT AS NVARCHAR(2000)
SET @COL_SELECT = '
SELECT DISTINCT column_name
FROM information_schema.COLUMNS
WHERE table_name = ''' + @table + '''
AND column_name like ''' + @modulo + @column + @modulo + ''''
PRINT @COL_SELECT
EXEC (@COL_SELECT)
打印将为您提供:
SELECT DISTINCT column_name
FROM information_schema.COLUMNS
WHERE table_name = 'proposals'
AND column_name like '%daypart%'
执行此查询时应无错误。
在@COL_SELECT、@table和@modulo变量前后使用两个引号:
DECLARE @table as NVARCHAR(25) = 'proposals'
DECLARE @column as NVARCHAR(25) = 'daypart'
DECLARE @modulo as NVARCHAR(5) = '%'
DECLARE @COL_SELECT AS NVARCHAR(2000)
SET @COL_SELECT = '
SELECT DISTINCT column_name
FROM information_schema.COLUMNS
WHERE table_name = ''' + @table + '''
AND column_name like ''' + @modulo + @column + @modulo + ''''
EXEC(@COL_SELECT)
希望能有帮助。
里卡多在这里要小心。这似乎非常容易受到sql注入的攻击。要调试这样的动态sql,您应该使用PRINT命令,以便在运行动态sql之前查看它。这将有助于解决动态sql中使用引号的许多问题。@SeanLange,非常正确!在这种情况下,它至少会指出一个事实,即动态SQL甚至没有达到:-)这里也会发生同样的事情,如果我使用三重引号,我会得到“daypart附近的语法不正确”。为什么要尝试三重引号?如果我使用单引号,我会得到“daypart附近的语法不正确”var@table也需要三个引号,您对
的定义是否会导致类似于“%+daypart+%”的?为什么使用+
符号?抱歉,刚才看到您的打印输出。。。好的,但仍然是:为什么?不,它会导致像“%”+'daypart'+'%'
实际上,这是一种过分的做法,改为像“%daypart%”
DECLARE @table as NVARCHAR(25) = 'proposals'
DECLARE @column as NVARCHAR(25) = 'daypart'
DECLARE @modulo as NVARCHAR(5) = '%'
DECLARE @COL_SELECT AS NVARCHAR(2000)
SET @COL_SELECT = '
SELECT DISTINCT column_name
FROM information_schema.COLUMNS
WHERE table_name = ''' + @table + '''
AND column_name like ''' + @modulo + @column + @modulo + ''''
EXEC(@COL_SELECT)