SQL Server过程,包含表名,字段名和记录ID的参数

时间:2016-03-04 14:02:33

标签: sql-server

我在SQL Server中尝试此操作并抛出错误:

ALTER PROCEDURE [dbo].[GET_TEXT_DETAIL]
    @id UNIQUEIDENTIFIER,
    @table VARCHAR(255),
    @field VARCHAR(MAX)
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @sql VARCHAR(200)
    SET @sql = 'select ' + QUOTENAME(@field) + ' from ' + QUOTENAME(@table) + ' where ID = ' + QUOTENAME(@id)
    EXEC (@sql)
END

我收到此错误:

  

Msg 207,Level 16,State 1,Line 1
  列名称“CFC2776A-6EE1-E511-A172-005056A218B0”无效。

有没有办法做到这一点所以我不需要制作一堆或程序来从一堆不同的表中提取文本?

2 个答案:

答案 0 :(得分:4)

QUOTENAME有可选的第二个参数 quote char ,所以你很接近,这可以通过以下方式解决:

... QUOTENAME(@id, '''')

但这种情况下最合适的方法是传递参数:

set @cmd = '
    SELECT t.' + QUOTENAME(@field) + '
    FROM ' + QUOTENAME(@table) + ' t
    WHERE t.ID = @ID'

exec sp_executesql @cmd, N'@ID uniqueidentifier', @ID

服务器将能够重用@srutzsky提到的计划。因为@ID不再是查询文本的一部分,@ cmd文本对于不同的@ID(以及相同的@ table + @field)保持不变。

答案 1 :(得分:3)

ALTER PROCEDURE [dbo].[GET_TEXT_DETAIL]
(
    @id UNIQUEIDENTIFIER,
    @table SYSNAME,
    @field SYSNAME
)
AS
BEGIN

    SET NOCOUNT ON;

    DECLARE @SQL NVARCHAR(MAX)
    SET @SQL = '
        SELECT ' + QUOTENAME(@field) + '
        FROM ' + QUOTENAME(@table) + '
        WHERE ID = ''' + CAST(@id AS VARCHAR(36)) + ''''

    --PRINT @SQL
    EXEC sys.sp_executesql @SQL

END