Sql server 具有相似条件的动态SQL

Sql server 具有相似条件的动态SQL,sql-server,Sql Server,我尝试了以下代码的多种不同组合,但总是出现相同的错误 我发现以前的解决方案没有嵌入动态SQL的额外复杂性。任何帮助都将不胜感激 代码: 错误: Msg 402,16级,状态1,第6行 模运算符中的数据类型varchar和varchar不兼容 错误发生在这里: DECLARE @modulo as NVARCHAR(5) = ''%''; 这被解释为查找两个空字符串的模值 在这里使用单引号 更新注意! 还有一点:您必须在LIKE中为表名添加双引号才能创建正确的语句 DECLARE @COL_SE

我尝试了以下代码的多种不同组合,但总是出现相同的错误

我发现以前的解决方案没有嵌入动态SQL的额外复杂性。任何帮助都将不胜感激

代码:

错误:

Msg 402,16级,状态1,第6行
模运算符中的数据类型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)