我有以下查询:
DECLARE @value AS NVARCHAR(64) = 'value'
EXECUTE('SELECT w.id
FROM myarray w
WHERE LEN('+@value+') = 0')
我想知道如何在LEN
函数中使用声明的值来执行查询。值@expression
和@value
动态更改,因此我想在此执行中使用它们。
我收到错误
len函数需要1个参数
如何使用声明的值作为函数的参数?
提前致谢。
答案 0 :(得分:0)
那应该有用。尝试在动态sql中的列名称周围添加括号:
execute('SELECT w.id
FROM myarray w
WHERE LEN(['+@value+']) = 0')
答案 1 :(得分:0)
假设@value具有列的名称,就我个人而言,我会这样做,使用sys.columns
和sys.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)