select语句中的变量表名

Ash*_*ani 4 t-sql sql-server stored-procedures

我有一些表用于存储不同的文件信息,如拇指,图像,数据表,...

我正在编写一个存储过程来检索特定ID的文件名.就像是:

    CREATE PROCEDURE get_file_name(
    @id int,
    @table nvarchar(50)
    )as
    if @table='images'
        select [filename] from images
        where id = @id
    if @table='icons'
        select [filename] from icons
        where id = @id
....
Run Code Online (Sandbox Code Playgroud)

如何使用case when语句重写此过程,还是只使用表名作为变量?

Stu*_*tLC 5

您不能使用大小写..何时在FROM子句中的表之间切换(就像您可以在条件中ORDER BY).即如下:

select * from 
    case when 1=1
      then t1
      else t2
    end;
Run Code Online (Sandbox Code Playgroud)

不行.

所以你需要使用动态SQL.最好尽可能参数化查询,例如@id可以参数化值:

-- Validate @table is E ['images', 'icons', ... other valid names here]
DECLARE @sql NVARCHAR(MAX)
SET @sql = 'select [filename] from **TABLE** where id = @id';
SET @sql = REPLACE(@sql, '**TABLE**', @table);

sp_executesql @sql, N'@id INT', @id = @id;
Run Code Online (Sandbox Code Playgroud)

与所有动态Sql一样,请注意,unparameterized替换为查询的值(如@table)会使查询容易受到Sql Injection攻击.因此,我建议您确保@table来自可信来源,或者更好的是,在@table执行查询之前将值与可允许表的白名单进行比较.