如何在查询执行中使用动态变量作为函数中的参数

时间:2018-01-02 16:09:13

标签: sql sql-server

我有以下查询:

DECLARE @value AS NVARCHAR(64) = 'value'

EXECUTE('SELECT w.id
         FROM myarray w
         WHERE LEN('+@value+') = 0')

我想知道如何在LEN函数中使用声明的值来执行查询。值@expression@value动态更改,因此我想在此执行中使用它们。

我收到错误

  

len函数需要1个参数

如何使用声明的值作为函数的参数?

提前致谢。

3 个答案:

答案 0 :(得分:0)

那应该有用。尝试在动态sql中的列名称周围添加括号:

execute('SELECT w.id
FROM myarray w
WHERE LEN(['+@value+']) = 0')

答案 1 :(得分:0)

假设@value具有列的名称,就我个人而言,我会这样做,使用sys.columnssys.tables来避免SQL注入:

DECLARE @SQL nvarchar(MAX), @Value nvarchar(64);
SET @Value = 'value';

SELECT @SQL = 'SELECT w.IDENT_CURRENT
FROM myarray w
WHERE LEN(' + QUOTENAME([name]) + ') = 0;'
FROM sys.tables t
     JOIN sys.Columns c
WHERE t.object_id = c.object_id
  AND c.[name] = @Value;

EXEC sp_executesql @SQL;

编辑:如果@Value是一个持久值,那么执行:

DECLARE @Value nvarchar(64) = 'value';

EXEC sp_executesql N'SELECT w.IDENT_CURRENT FROM myarray w WHERE LEN(@dValue) = 0;', N'@dValue nvarchar(64)', @dvalue = @Value;

编辑2:

进一步说,使用Jorge Campos目前的答案。这是非常开放的注射。例如,使用以下内容创建一个额外的表:

CREATE TABLE myarray2 (id int);

DECLARE @value NVARCHAR(64) = 'value'

SET @Value = ''') = 0; CREATE TABLE dbo.Injection (ID int);--'

EXECUTE('SELECT w.id
         FROM myarray2 w
         WHERE LEN('''+@value+''') = 0');

GO
SELECT *
FROM injection;

DROP TABLE injection;
DROP TABLE myarray2;

在使用动态SQL时,请始终考虑SQL注入。 Jorge的回答引起了关注。

答案 2 :(得分:0)

试试这个..希望这对你有用(:

 DECLARE @value AS NVARCHAR(64) = 'value',
                       @String NVarchar(max)

          SET @String = 'SELECT w.id
                                     FROM myarray w
                                     WHERE 
          '+CONVERT(Varchar(20),LEN(@value))+'=0'

          EXECUTE (@String)