Sql-Server
FUNCTION 錯誤(SQL Server 2008)-“找不到任何一列…”
我有這個功能:
CREATE FUNCTION [dbo].[fn_xxx] ( @Nome VARCHAR(100), @Descricao VARCHAR(500) ) RETURNS @tbDados TABLE ( Qtd INT ) AS BEGIN DECLARE @CMD AS NVARCHAR(MAX); DECLARE @Tabela VARCHAR(100); DECLARE @CampoDescricao VARCHAR(100); --- *** Identifica os campos e tabelas SET @Tabela = 'tbl' + @Nome; SET @CampoDescricao = 'Desc' + @Nome; SET @CMD = ' INSERT INTO @tbDados (Qtd) SELECT @Qtd = COUNT(*) FROM ' + @Tabela + ' WHERE ' + @CampoDescricao + ' = ''' + replace(@Descricao, '''', '`') + ''';'; EXEC sp_executesql @CMD; RETURN END
我試圖在這裡幫助開發人員,但沒有成功。
當我們執行它(
select dbo.fn_xxx ('processador','teste')
)它給我們這個錯誤:找不到列“dbo”或使用者定義的函式或聚合“dbo.fn_xxx”,或者名稱不明確。
我一直在網際網路上搜尋,並找到了一些結果,但都是關於程式碼的。
有人可以幫我找出這個函式中的這個錯誤嗎?
謝謝
編輯:
如果我執行它:
SELECT * FROM [EasyTablet].[dbo].[fn_xxx] ( 'processador','teste' ) GO
它向我顯示了這個錯誤:
只有函式和一些擴展儲存過程可以在函式內執行。
您不能在函式內使用動態 SQL(好吧,除了這個可怕的 hack之外)。主要原因是函式只能返回數據,不能有副作用。SQL Server 無法阻止您向 sp_executesql 傳遞插入或更新(順便說一句,無論您最終如何實現它,這看起來都像是一個 SQL 注入攻擊向量)。
我不清楚您為什麼首先將其作為多語句 TVF 來執行。您將返回一列和一行。為什麼不使用帶有輸出參數的儲存過程?