我正在尝试选择具有相同列的所有表,并且该列中的实例与我指定的字符串格式匹配。
例如,
表1:
FirstName,LastName,ID
表2:
ID,值
表3:
FirstName,Value
我希望我的结果显示包含ID的表,其中ID以字符'a'
开头到目前为止,我所拥有的是
SELECT SYS.TABLES.NAME FROM SYS.TABLES
INNER JOIN SYS.COLUMNS
ON SYS.TABLES.OBJECT_ID = SYS.COLUMS.OBJECT_ID
WHERE SYS.COLUMS.NAME = 'ID'
然后我不知道如何继续。任何帮助表示赞赏:)
答案 0 :(得分:1)
此代码经过测试且有效:
创建一个游标,选择其中列= ID的所有表/列名称(我们不需要列变量,因为您只定位'ID',但我包含它以防您或其他人需要更多功能)。
存储了这些信息后,您可以遍历游标并执行动态SQL。请注意,这很容易受到SQL注入的影响,就像几乎所有动态SQL一样。
这种方法将为每个具有列ID的表提供单独的数据表 - 即使没有符合条件的ID列(您只需为这些列获取空白数据表)。
此外,您可以根据需要更改变量的大小。
如果您需要任何澄清或修改,请与我们联系。
DECLARE @TableName varchar(255), @ColumnName varchar(255), @SQL varchar(1000)
DECLARE TempCursor CURSOR FOR
SELECT T.[name] AS [TableName], C.[name] AS [ColumnName]
FROM sys.tables T
JOIN sys.columns C
ON T.object_id = C.object_id
WHERE C.[name] = 'ID'
OPEN TempCursor
FETCH NEXT FROM TempCursor INTO @TableName, @ColumnName
WHILE @@FETCH_STATUS = 0
BEGIN
SET @SQL = 'SELECT * FROM ' + @TableName
SET @SQL = @SQL + ' WHERE ' + @ColumnName + ' like ''a%'''
EXECUTE (@SQL)
FETCH NEXT FROM TempCursor INTO @TableName, @ColumnName
END
CLOSE TempCursor
DEALLOCATE TempCursor
答案 1 :(得分:0)
您可以使用“LIKE”从“a”开始选择一次:
SELECT SYS.TABLES.NAME AS t
FROM SYS.TABLES INNER JOIN SYS.COLUMNS
ON SYS.TABLES.OBJECT_ID = SYS.COLUMS.OBJECT_ID
WHERE SYS.COLUMNS.NAME = 'ID' AND EXISTS (SELECT * FROM t WHERE t.ID LIKE 'a%');
符号“%”表示字母“a”
后面可以出现任何字符组合答案 2 :(得分:0)
我仍然不知道我的问题是否正确 - 但是试试吧!
使用以下查询获取包含列ID
SELECT SYS.TABLES.NAME , SYS.COLUMNS.NAME
FROM SYS.TABLES INNER JOIN SYS.COLUMNS
ON SYS.TABLES.OBJECT_ID = SYS.COLUMNS.OBJECT_ID
WHERE SYS.COLUMNS.NAME = 'ID';
您必须遍历表格名称(想想cursor
,while
等)。
在循环中,尝试类似这样的东西
declare @resultcount int;
declare @QueryMain as nvarchar(4000)
set @QueryMain = N'SELECT * FROM <TABLE_NAME> WHERE ID LIKE ''a%'''
exec sp_executesql @QueryMain
set @resultcount = @@rowcount;
检查@resultcount
的值以查看当前表名是否合格并使用类似临时表的内容来收集它。
您可以使用sp_executesql中的其他选项来调整此查询