我在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”无效。
有没有办法做到这一点所以我不需要制作一堆或程序来从一堆不同的表中提取文本?
答案 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