在 SQL Server 中创建一个拆分函数(对于较新的版本有更好的函数,但这是您在 SQL Server 2000 中得到的):
CREATE FUNCTION dbo.SplitStrings
(
@List NVARCHAR(4000),
@Delimiter CHAR(1)
)
RETURNS @Items TABLE
(
Item NVARCHAR(4000)
)
AS
BEGIN
DECLARE
@Item VARCHAR(12),
@Pos INT;
WHILE LEN(@List)>0
BEGIN
SET @Pos = CHARINDEX(@Delimiter, @List);
IF @Pos = 0
SET @Pos = LEN(@List)+1;
SET @Item = LEFT(@List, @Pos-1);
INSERT @Items SELECT LTRIM(RTRIM(@Item));
SET @List = SUBSTRING(@List, @Pos + LEN(@Delimiter), LEN(@List));
IF LEN(@List) = 0 BREAK;
END
RETURN;
END
GO
然后创建一个存储过程:
CREATE PROCEDURE dbo.RunScaryQuery
@columns NVARCHAR(4000),
@table NVARCHAR(255)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @collist NVARCHAR(4000), @sql NVARCHAR(4000);
SELECT @collist = COALESCE(@collist + ',', '') + c.name
FROM syscolumns AS c
INNER JOIN dbo.SplitStrings(@columns, ',') AS s
ON s.Item = c.name
WHERE c.id = OBJECT_ID(@table);
SELECT @sql = 'SELECT ' + @collist + ' FROM ' + @table
-- where ...
;
EXEC sp_executesql @sql;
END
GO
现在使用正确参数化的命令对象从 ASP 调用该存储过程。
这将确保您的 SQL 查询仅使用表中实际存在的列名生成。(任何废话都会被忽略。)
这假定您将在列表中获得至少一个有效的列名。