【发布时间】:2016-06-23 14:52:33
【问题描述】:
我正在尝试学习如何使用串联过程,但它没有返回我想要的结果。即使我使用命令
EXEC SP_NAME_PROCEDURE NULL,NULL,NULL,NULL
或使用正确的数据。
ALTER PROCEDURE SP_LISTA_PEDIDOS
@Sdatainicio varchar(100),
@Sdatafim varchar(100),
@chaveBusca varchar(100),
@TipoBusca varchar(100)
AS
DECLARE @SQL VARCHAR(8000)
SET @SQL += 'SELECT *,b.descricao as dscstatus,c.nome as cliente '
SET @SQL += ' FROM pedidos a with(nolock), '
SET @SQL += ' pedidos_status b with(nolock), '
SET @SQL += ' cadastro c with(nolock) '
SET @SQL += ' WHERE '
SET @SQL += ' a.status <> '''' and '
SET @SQL += ' a.status=b.status and '
SET @SQL += ' a.id_doc = c.id_doc '
IF isnull(@chaveBusca,'')<>''
BEGIN
IF isnull(@TipoBusca,'') = 'PEDIDO'
SET @SQL += ' and a.numped= '''+@chaveBusca+''''
IF isnull(@TipoBusca,'') = 'CLIENTE'
SET @SQL += ' and c.nome like '''+@chaveBusca+'%'''
END
IF not (isnull(@chavebusca,'')<>'' and isnull(@TipoBusca,'') = 'PEDIDO')
SET @SQL += ' and data_inclusao BETWEEN '''+@Sdatainicio+''' AND '''+@Sdatafim+''''
SELECT @SQL
你们能帮我找出问题所在吗?
【问题讨论】:
-
“但它没有给我想要的结果。” - 好吧,它给了你什么结果,它想要什么?注意:这里是 sql 注入的噩梦。您实际上可以使用带有
sp_executesql的可变参数。@SQL的最终值将有助于我们调试 -
你还没有处理前两个参数的NULL。
-
旁注:您应该不为您的存储过程使用
sp_前缀。微软有reserved that prefix for its own use (see Naming Stored Procedures),你确实会在未来某个时候冒着名称冲突的风险。 It's also bad for your stored procedure performance。最好只是简单地避免sp_并使用其他东西作为前缀 - 或者根本不使用前缀! -
设置Bad Habits to kick - putting NOLOCK everywhere - 不建议在任何地方使用它 - 恰恰相反!
-
感谢您的提示。我是新手,真的很想了解更多。我会留意程序名称。关于结果,当我使用 NULL 作为值时,我希望它给我完整的表(没有 WHERE 子句)。
标签: sql-server stored-procedures concatenation