MS SQL2008 查询数据表

Jakey_Ch 2014-06-18 05:04:22
有这样一个表,十个字段(col0->col9),要查询的只有3个字段(col0,col3,col8)--(实际可能是二十倍)
现在想到的方法有:
1、使用存储过程: SELECT * FROM [my_table] WHERE [id]=@id
然后根据获取到的DataSet再取出需要的3个字段
2、在程序中用字段组装一个SQL语句进行查询
SELECT [col0], [col3], [col8] FROM [my_table] WHERE [id]=@id
3、使用存储过程,在该存储过程中组装该SQL语句进行查询。
-------------------------------------------------------------------------------------------
个人想用第三种方法来实现,但是实在不知该如何来写这个存储过程,望有空的骚年帮忙建议/示例一下
万分感谢!!

...全文
117 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jakey_Ch 2014-06-19
  • 打赏
  • 举报
回复
引用 7 楼 joylwu 的回复:
-- 假设@target_cols传参为"col0,col1,col5,col7" 的话,就需要字符串拆分 不拆分就变成了
name  IN ( ‘col0,col1,col5,col7’ )
实际需要为
name  IN ( 'col0','col1','col5','col7' )
DECLARE @s NVARCHAR(4000)
		SET @target_cols = replace(''''+@target_cols+'''', ',', ''',''')
		SET @s = ''
		SELECT  @s = @s + ',' + 'isnull('+QUOTENAME(name)+','''')'
		FROM    syscolumns
		WHERE   id = OBJECT_ID('[my_table]')
				AND name  IN ( @target_cols )
		SET @s = STUFF(@s, 1, 1, '')
		EXEC('select '+@s+' from [my_table]')
怎么来拆分额,这样得到的貌似是
name  IN (’ 'col0','col1','col5','col7'‘ )
而不是
name  IN ( 'col0','col1','col5','col7' )
Joylwu 2014-06-19
  • 打赏
  • 举报
回复
--字符串拆分函数
CREATE FUNCTION [dbo].[fn_split]
    (
      @c NVARCHAR(MAX) ,
      @split NVARCHAR(20) = ','
    )
RETURNS @t TABLE ( col NVARCHAR(MAX) )
AS 
    BEGIN                 
        WHILE ( CHARINDEX(@split, @c) <> 0 ) 
            BEGIN             
                INSERT  @t
                        ( col
                        )
                VALUES  ( SUBSTRING(@c, 1, CHARINDEX(@split, @c) - 1)
                        )             
                SET @c = STUFF(@c, 1, CHARINDEX(@split, @c) + LEN(@split) - 1,
                               '')             
            END          
        IF ( @c <> '' ) 
            INSERT  @t
                    ( col )
            VALUES  ( @c )           
        RETURN      
    END    

--调用函数
SELECT * FROM fn_split('col0,col1,col5,col7',',')

--结果
	col
--------
1	col0
2	col1
3	col5
4	col7
创建字符串分割函数,然后根据3楼的动态SQL,将
AND name  IN ( '希望显式的列' )
修改为
AND name  IN (SELECT * FROM fn_split('col0,col1,col5,col7',','))
若有错误,先将拼成的动态SQL print出来再排查
Joylwu 2014-06-18
  • 打赏
  • 举报
回复
引用 6 楼 u011062542 的回复:
ALTER PROCEDURE [dbo].[mysp_query_record]
		@id VarChar(32),
		@target_cols VarChar(MAX)
AS

SET NOCOUNT ON
		-- 如果@target_cols传参为"col0,col1,col5,col7"的话,是不是这样写就可以了?
		EXEC('select '+@target_cols+' from [my_table] where [id] = ' + @id)

SET ANSI_NULLS OFF
SET QUOTED_IDENTIFIER OFF

GO
ALTER PROCEDURE [dbo].[mysp_query_record]
		@id VarChar(32),
		@target_cols VarChar(MAX)
AS

SET NOCOUNT ON
		DECLARE @s NVARCHAR(4000)
		SET @s = ''
		SELECT  @s = @s + ',' + 'isnull('+QUOTENAME(name)+','''')'
		FROM    syscolumns
		WHERE   id = OBJECT_ID('[my_table]')
				AND name  IN ( @target_cols )  -- 假设@target_cols传参为"col0,col1,col5,col7"
		SET @s = STUFF(@s, 1, 1, '')
		EXEC('select '+@s+' from [my_table]  ')  -- 查询的条件的话,是直接加到后面吗?比如:
												 -- EXEC('select '+@s+' from [my_table] where [id] = ' + @id)
SET ANSI_NULLS OFF
SET QUOTED_IDENTIFIER OFF
GO
问题有点多啊 麻烦了~~~
-- 假设@target_cols传参为"col0,col1,col5,col7" 的话,就需要字符串拆分 不拆分就变成了
name  IN ( ‘col0,col1,col5,col7’ )
实际需要为
name  IN ( 'col0','col1','col5','col7' )
Jakey_Ch 2014-06-18
  • 打赏
  • 举报
回复
ALTER PROCEDURE [dbo].[mysp_query_record]
		@id VarChar(32),
		@target_cols VarChar(MAX)
AS

SET NOCOUNT ON
		-- 如果@target_cols传参为"col0,col1,col5,col7"的话,是不是这样写就可以了?
		EXEC('select '+@target_cols+' from [my_table] where [id] = ' + @id)

SET ANSI_NULLS OFF
SET QUOTED_IDENTIFIER OFF

GO
ALTER PROCEDURE [dbo].[mysp_query_record]
		@id VarChar(32),
		@target_cols VarChar(MAX)
AS

SET NOCOUNT ON
		DECLARE @s NVARCHAR(4000)
		SET @s = ''
		SELECT  @s = @s + ',' + 'isnull('+QUOTENAME(name)+','''')'
		FROM    syscolumns
		WHERE   id = OBJECT_ID('[my_table]')
				AND name  IN ( @target_cols )  -- 假设@target_cols传参为"col0,col1,col5,col7"
		SET @s = STUFF(@s, 1, 1, '')
		EXEC('select '+@s+' from [my_table]  ')  -- 查询的条件的话,是直接加到后面吗?比如:
												 -- EXEC('select '+@s+' from [my_table] where [id] = ' + @id)
SET ANSI_NULLS OFF
SET QUOTED_IDENTIFIER OFF
GO
问题有点多啊 麻烦了~~~
發糞塗牆 2014-06-18
  • 打赏
  • 举报
回复
DECLARE @s NVARCHAR(4000) SET @s = '' SELECT @s = @s + ',' + 'isnull('+QUOTENAME(name)+','''')' FROM syscolumns WHERE id = OBJECT_ID('表名') AND name IN ( '希望显式的列' ) SET @s = STUFF(@s, 1, 1, '') EXEC('select '+@s+' from 表名 ') 这句是动态查找列,你在 AND name IN ( '希望显式的列' )输入你希望保留的列,然后“表名”改成你实际的名就可以了
Jakey_Ch 2014-06-18
  • 打赏
  • 举报
回复
ALTER PROCEDURE [dbo].[mysp_query_record]
		@id VarChar(32),
		@col0 VarChar(32)=null,
		@col1 VarChar(32)=null,
		@col2 VarChar(32)=null,
		@col3 VarChar(32)=null,
		@col4 VarChar(32)=null
AS

SET NOCOUNT ON
		DECLARE @s NVARCHAR(4000)
		SET @s = ''
		SELECT  
			@s = @s + ',' + 'isnull('+QUOTENAME(name)+','''')'
		FROM    
			syscolumns
		WHERE   
			[id] = OBJECT_ID('[my_table]')
			AND name  IN 
			( 
				(CASE WHEN isnull(@col0,'')='' THEN null ELSE '@col0' END),
				(CASE WHEN isnull(@col1,'')='' THEN null ELSE '@col1' END),
				(CASE WHEN isnull(@col2,'')='' THEN null ELSE '@col2' END),
				(CASE WHEN isnull(@col3,'')='' THEN null ELSE '@col3' END),
				(CASE WHEN isnull(@col4,'')='' THEN null ELSE '@col4' END)
			)
		SET @s = STUFF(@s, 1, 1, '')
		
		EXEC('select '+@s+' from [my_table] where [id] = ' + @id)

SET ANSI_NULLS OFF
SET QUOTED_IDENTIFIER OFF

GO
还不是很理解这些语句的意思,如果我要按照这个方法来实现我想要的功能的话 是不是按照我上面的改写方法就可以了呢?【偷懒减少了5列】
引用 3 楼 DBA_Huangzj 的回复:
DECLARE @s NVARCHAR(4000)
SET @s = ''
SELECT  @s = @s + ',' + 'isnull('+QUOTENAME(name)+','''')'
FROM    syscolumns
WHERE   id = OBJECT_ID('表名')
        AND name  IN ( '希望显式的列' )
SET @s = STUFF(@s, 1, 1, '')
EXEC('select '+@s+' from 表名  ')
發糞塗牆 2014-06-18
  • 打赏
  • 举报
回复
DECLARE @s NVARCHAR(4000)
SET @s = ''
SELECT  @s = @s + ',' + 'isnull('+QUOTENAME(name)+','''')'
FROM    syscolumns
WHERE   id = OBJECT_ID('表名')
        AND name  IN ( '希望显式的列' )
SET @s = STUFF(@s, 1, 1, '')
EXEC('select '+@s+' from 表名  ')
Jakey_Ch 2014-06-18
  • 打赏
  • 举报
回复
都不是固定的,有可能N个列,根据传参来决定(会传要查询的字段参数比如p=col0&p=col7&p=col9就是查询这3个字段的,其他以此类推)
引用 1 楼 DBA_Huangzj 的回复:
你是想在N个列的表中不管如何都只获取3个列,并且列名是固定的是吧?
發糞塗牆 2014-06-18
  • 打赏
  • 举报
回复
你是想在N个列的表中不管如何都只获取3个列,并且列名是固定的是吧?

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧